我有2个表,其中一个包含其中的类别,另一个表中包含不同的项目。
我想要做的就是选择 item_id和cat_id,并将每个类别的结果限制为5,例如:
cat_id item_id
1 1
1 2
1 3
1 4
2 5
2 6
3 7
...等 我提出的最接近的查询
SELECT cat.cat_id, cat.cat_name, item_id, item_author, item_name, item_pic_big
FROM item_table ipt
JOIN cat_table cat ON ipt.cat_id = cat.cat_id
GROUP BY item_id
HAVING COUNT(*) < 5
ORDER BY cat.cat_id
这就是我在stackoverflow上发现的,但是如果我想改变计数让我们说... 2,它给了我相同的结果,如果我将组更改为cat_id,它只给我1个结果。
任何帮助将不胜感激
答案 0 :(得分:2)
你真正需要的是:
SELECT
cat.cat_id, cat.cat_name, item_id, item_author, item_name, item_pic_big
FROM item_table a
JOIN cat_table b ON a.cat_id = b.cat_id
WHERE a.item_id IN (SELECT item_id
FROM item_table
WHERE cat_id = b.cat_id
LIMIT 5)
GROUP BY a.item_id
ORDER BY b.cat_id
不幸的是,如果你试图运行它,你会感到失望 错误讯息:
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
所以你需要一个解决方法。您可以在此处查看可能的解决方法列表: http://www.artfulsoftware.com/infotree/queries.php#104
编辑:第一个解决方案可以转换为您的结构,如下所示: (我没有你的表,因此可能会出现小的列名称问题)
SELECT temp2.cat_id, temp2.item_id,
temp2.cat_name, temp2.item_author,
temp2.item_name, temp2.item_pic_big
FROM
(SELECT
temp.cat_id,
temp.item_id,
temp.cat_name,
temp.item_author,
temp.item_name,
temp.item_pic_big,
IF( @prev <> temp.cat_id, @rownum := 1, @rownum := @rownum+1 ) AS rank,
@prev := temp.cat_id
FROM (SELECT
a.item_id,
b.cat_id,
b.cat_name,
a.item_author,
a.item_name,
a.item_pic_big
FROM item_table a
JOIN cat_table b ON a.cat_id = b.cat_id
ORDER BY cat_id, item_id) AS temp
JOIN (SELECT @rownum := NULL, @prev := 0) AS r
ORDER BY temp.cat_id, temp.item_id) as temp2
WHERE temp2.rank <= 5
ORDER BY temp2.cat_id, temp2.item_id;