2014-08-31 66 views
3

加入我有2個表,類別和文章,我想每個類別的5篇文章,這些表是這樣的:的MySQL選擇內有限制

category: id, name 
articles: id, title, body, category_id 

所以我通常做的是INNER JOIN,但我得到所有的行,我怎麼能指定我只需要每個類別5行,我想它會需要一個SELECT內的SELECT?

+1

你用什麼標準爲你的「前5名」? – 2014-08-31 12:50:00

+0

@JeffWatkins我有文章日期和ORDER BY日期DESC,但真的這並不重要,但現在,thx – Amin 2014-08-31 12:51:02

+1

檢查:[組內配額(每組最多N)](http://www.artfulsoftware.com/infotree/ qrytip.php?id = 104) – wchiquito 2014-08-31 13:00:36

回答

1

由於MySQL不支持windows功能,因此您可以在MySQL中使用group_concat來破解您的查詢。雖然它看起來不漂亮。

您可以使用this blog post作爲靈感來構建您所需的查詢。

其他可能性是檢索類別中的每篇文章,並在客戶端(PHP,Java,Python,您命名它)篩選前5名。

+0

感謝@Pablo,我認爲可能比從客戶端做起更容易一些,但我估計它不會離開它! – Amin 2014-08-31 12:57:29

3

你可以使用排名查詢mysql沒有這種類型的結果的窗口函數來獲得每組n記錄,我不會建議group_concat解決方案,因爲articles條款說,可以有足夠的數據,並容易通過1024字符限制的約束,如果你增加此限制,也有max_allowed_packet依賴太

SELECT * FROM (
SELECT *, 
@r:= CASE WHEN @g = c.id THEN @r +1 ELSE 1 END rownum, 
@g:= c.id catgroup 
FROM category c 
JOIN articles a ON (c.id = a,category_id) 
CROSS JOIN (SELECT @g:=0,@r:=0) t2 
ORDER BY c.id , a.`date` desc 
) t 
WHERE rownum <= 5 

以上將在其類別組中的排名每一篇文章,你可以看到rownum別名和外部查詢結果只是過濾文章結果爲每種類別5組

+1

@downvoters謹慎解釋downvote的原因 – 2014-08-31 14:16:48

+0

此代碼確實有效。但是,我怎麼限制只搜索限制範圍內的所有類別?就像我們有100個類別,但是我們只想顯示前10個(限制0,10),然後是下10個(限制10,20)等文章?我用你的代碼嘗試了令人滿意的LIMIT,但似乎不起作用,它返回所有類別。我想要在一個類別數據部分上執行inner join – voytez 2016-01-29 19:50:09

+1

@voytez你可以針對你的問題提出一個新的問題,針對你的問題將會在from子句中使用一個子選擇而不是像'from(select *從類別順序由some_col限制0,10)作爲c' – 2016-01-29 20:14:14