从查询中获取正确的结果我遇到了一些麻烦。
目前我有两张桌子,main_cats和产品。
我所追求的结果是6个记录,按日期顺序,只有一个唯一的main_cat_id。
基本表结构是
当我将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。
答案 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 JOIN
到icm
只是原始问题中的一个,因此我们可以检索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个;如果您在特定类别中没有项目,那么将不会检索任何行)。