2011-04-21 52 views
2

我有2個表,其中一個具有其中的類別,另一個具有不同的項目。將JOIN查詢限制爲每個類型中的5個

我想要做的就是選擇 的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 

這就是我的計算器發現,但是如果我想改變計數讓我們說... 2,它給了我同樣的結果,如果我通過改變組CAT_ID,它只給了我1個結果。

任何幫助,將不勝感激

回答

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; 
+0

這很複雜...... :)謝謝 – 2011-04-26 14:57:17

+0

@Itai - Ein Be'aya :) – Galz 2011-04-26 15:36:29

相關問題