如何使用联接以日期顺序检索一组记录

时间:2011-11-07 16:28:25

标签: mysql

从查询中获取正确的结果我遇到了一些麻烦。

目前我有两张桌子,main_cats和产品。

我所追求的结果是6个记录,按日期顺序,只有一个唯一的main_cat_id。

基本表结构是

  • Main_cats:main_cat_id,main_cat_title
  • 产品:product_id,main_cat_id,product_name,date_added。

当我将main_cat表加入到products表时,我遇到了问题。它似乎完全忽略了ORDER BY子句。

SELECT date_added, product_name,main_cat_title FROM ic_products p 
JOIN ic_main_cats icm on icm.main_cat_id=p.main_cat_id 
WHERE p.main_cat_id IN (1,2,12,22,6,8)
GROUP BY p.main_cat_id
ORDER BY date_added   ASC
LIMIT 6

如果我将联接退出,则查询有效但显示多个main_cat_id,我无法根据需要显示main_cat_title。

2 个答案:

答案 0 :(得分:0)

这应该有用......

SELECT p.main_cat_id as cat_id, product_name,main_cat_title, MAX(date_added) FROM ic_products p 
JOIN ic_main_cats icm on icm.main_cat_id=p.main_cat_id 
WHERE p.main_cat_id IN (1,2,12,22,6,8)
GROUP BY p.main_cat_id
ORDER BY date_added   ASC
LIMIT 6

答案 1 :(得分:0)

您的问题是(内心)“每组选择最小/最大日期及相关字段”问题。

SELECT p.date_added, p.product_name, icm.main_cat_title
FROM ic_products p 
LEFT JOIN ic_products p2
 ON p.main_cat_id=p2.main_cat_id
 AND p.date_added > p2.date_added
LEFT JOIN ic_main_cats icm ON icm.main_cat_id=p.main_cat_id 
WHERE p2.date_added IS NULL
AND p.main_cat_id IN (1,2,12,22,6,8)

让我解释一下:看一下这个表,它是上面查询的第一个LEFT JOIN

SELECT p.date_added, p.product_name
FROM ic_products p 
LEFT JOIN ic_products p2
 ON p.main_cat_id=p2.main_cat_id
 AND p.date_added > p2.date_added
WHERE p2.date_added IS NULL

这会将products连接到自身:它会生成一个表,其中每个类别中的date_added对的每个组合都有,其中第一列中的日期始终大于第二列中的日期。

由于这是左连接,当第一列中的日期对于该类别最小时,第二列中的日期将为NULL

所以这基本上选择了每个类别的最短日期(我假设你想要最短的日期,即最早出现的日期,基于你问题中的ORDER BY date_added ASC - 如果你想要最新的date_added你' d将上述联接中的>更改为<

第二个LEFT JOINicm只是原始问题中的一个,因此我们可以检索main_cat_title

这里不需要LIMIT 6,因为首先,由于第一个main_cat_id,每LEFT JOIN只检索一行,其次,AND p.main_cat_id IN (1,2,12,22,6,8)仅选择6类别。因此,每个类别在一行中有6个类别检索6行。 (或者最多6个;如果您在特定类别中没有项目,那么将不会检索任何行)。