如何将连接限制为每个记录一个结果,以便MYSQL

时间:2011-05-24 02:12:01

标签: mysql sql group-by sql-order-by

我目前有两个表,一个用于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 :(得分:0)

如果AUTO_INCREMENTndxz_media名为id(例如),您可以在子查询中获取MAX(id)MIN(id),然后加入反对它。

我认为这是有效的,因为MySQL允许GROUP BY中未指定的列与聚合一起包含。这是子查询中的media_filemedia_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

中找到了这个