将JOIN查询限制为每种类型的5个

时间:2011-04-21 06:34:55

标签: mysql

我有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个结果。

任何帮助将不胜感激

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;