Как ограничить объединение одним результатом на запись, для MYSQL - PullRequest
1 голос
/ 24 мая 2011

В настоящее время у меня есть две таблицы: одна для pages (объекты) и одна для images (носители).

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

Я пробовал несколько подзапросов + Distinct, но пока не совсем заработал.

Может кто-нибудь направить меня в правильном направлении. Я пробовал группировать, но после сортировки это не работает и поэтому возвращает неправильное изображение.

SELECT title, 
   url, 
   media_file, 
   media_order
FROM ndxz_objects 
   LEFT JOIN ndxz_media ON ndxz_objects.id = ndxz_media.media_ref_id
WHERE `status` = 1
   AND `section_id` = 2
GROUP BY title, url, media_file, media_order
ORDER BY ndxz_objects.ord, ndxz_media.media_order

Ответы [ 2 ]

0 голосов
/ 25 мая 2011

Я не нашел этот запрос работающим, это то, что я использовал в конце.

SELECT title, url, media_file
FROM ".PX."objects
LEFT JOIN
    (
SELECT m1.media_id, m1.media_ref_id, m1.media_file, m1.media_order
    FROM ".PX."media AS m1
    LEFT JOIN ".PX."media AS m2 ON m1.media_ref_id = m2.media_ref_id AND m1.media_order    > m2.media_order
    WHERE m2.media_ref_id IS NULL        
    )
maxmedia ON ndxz_objects.id = maxmedia.media_ref_id
WHERE `status` = 1
AND `section_id` = 2
ORDER BY `ord`

Я нашел это в разделе групповых агрегатов здесь , который выглядит как хорошая группа примеров SQL

0 голосов
/ 24 мая 2011

Если у вас есть AUTO_INCREMENT внутри ndxz_media с именем id (например), вы можете получить MAX(id) или MIN(id) в подзапросе и присоединиться к нему.

Iдумаю, что это работает, потому что MySQL позволяет включать столбцы, не указанные в GROUP BY, вместе с агрегатом.Здесь это media_file и media_order в подзапросе.

SELECT title, 
   url, 
   media_file, 
   media_order
FROM ndxz_objects
  JOIN (
     SELECT media_ref_id, MIN(media_order), media_file
     FROM ndxz_media
     GROUP BY media_ref_id
  ) maxmedia ON ndxz_objects.id = maxmedia.media_ref_id
WHERE etc. etc. etc.

Принимая media_order как высокое / низкое значение вместо использования теоретического id, внутренний подзапрос будет выглядеть следующим образом,Все остальное, кроме паренов, не меняется.

SELECT
  media_ref_id,
  MIN(media_order) AS media_order,
  media_file
FROM ndxz_media
GROUP BY media_ref_id, media_file

Сначала запустите один подзапрос.Он должен получить единственные записи.Затем, при помещении в парены, соединение должно работать правильно.

...