我目前有两个表,一个用于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
答案 0 :(得分:0)
如果AUTO_INCREMENT
内ndxz_media
名为id
(例如),您可以在子查询中获取MAX(id)
或MIN(id)
,然后加入反对它。
我认为这是有效的,因为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
,内部子查询将如下所示。 parens之外的其他所有内容都不会改变。
SELECT
media_ref_id,
MIN(media_order) AS media_order,
media_file
FROM ndxz_media
GROUP BY media_ref_id, media_file
首先单独运行子查询。它应该检索单数记录。然后当放入parens时,连接应该正常工作。
答案 1 :(得分:0)
我没有发现查询有效,这是我最后使用的。
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`
我在这里的内部群体聚集部分which seems like a good group of sql examples
中找到了这个