Получение только изображения по умолчанию для свойства

0

Я пытаюсь получить список свойств, и для этого мне нужно связать 4 таблицы. Таблицами являются: свойство, свойство_type, состояние и фотография.

Проблема получает ТОЛЬКО образ по умолчанию для свойства. По умолчанию используется фотография с наименьшим номером ранга. Поэтому, если для свойства 10 есть 2 фотографии, то в этом результирующем наборе должен быть тот, у кого значение более низкого ранга.

Взгляните на то, что у меня есть до сих пор, оно должно объяснить, что я сделал до сих пор. В основном это показывает список свойств, включая идентификатор фотографии, присвоенный этому свойству. К сожалению, поскольку я использую GROUP BY для устранения дополнительных результатов (не нужно 5 строк для одного свойства, если есть 5 фотографий, назначенных ему), упорядочение по рангу фотографии не меняет мои результаты, как я думал.

SELECT 
 property.property_id,
 property.property_name,
 state.state_id,
 state.state_name,
 photo.photo_id,
 photo.rank
FROM property 
JOIN photo
 ON property.property_id = photo.property_id
JOIN property_type
 ON property.property_type_id = property_type.property_type_id
JOIN state
 ON property.state_id = state.state_id    
GROUP BY property.property_id
ORDER BY  
 state.state_name ASC,
 property.property_name ASC,
 photo.rank ASC

Может ли кто-нибудь указать мне в правильном направлении? Одно замечание: я прихожу в этот проект, который уже завершен. Таким образом, структура базы данных в данный момент не может быть изменена.

Теги:
greatest-n-per-group

1 ответ

2
Лучший ответ

Использование:

  SELECT p.property_id,
         p.property_name,
         s.state_id,
         s.state_name,
         x.photo_id,
         x.rank
    FROM PROPERTY p
    JOIN PHOTO x ON x.property_id = p.property_id
    JOIN (SELECT ph.property_id,
                 MIN(ph.rank) AS min_rank
            FROM PHOTO ph
        GROUP BY ph.property_id) y ON y.property_id = x.property_id
                                  AND y.min_rank = x.rank
    JOIN PROPERTY_TYPE pt ON pt.property_type_id = p.property_type_id
    JOIN STATE s ON s.state_id = p.state_id   
GROUP BY p.property_id
ORDER BY s.state_name, p.property_name

Я изменил ваш запрос, чтобы сделать самосоединение с копией таблицы PHOTO, чтобы получить минимальный ранг за значение property_id. Присоединившись к таблице PHOTO, я могу гарантировать, что будет возвращена только самая ранняя запись PHOTO.

  • 0
    Хм .. разве нет ошибки синтаксиса в "ON x.property_id"? Поднят голос, потому что подход правильный.
  • 0
    @ Radu094: спасибо, исправлено. Я слишком много внимания уделял ФОТОГРАФИИ :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню