mysql选择内部连接和限制

时间:2014-08-31 12:46:45

标签: mysql sql select

我有2个表,类别和文章,我想为每个类别获得5篇文章,表格如下:

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

所以我通常做的是INNER JOIN,但是我得到了所有行,如何指定每个类别只需要5行,我想在SELECT中需要SELECT?

2 个答案:

答案 0 :(得分: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 :(得分:1)

你可以在MySQL中使用group_concat来破解你的查询,因为MySQL不幸地不支持windows函数。虽然它看起来不太漂亮。

您可以使用this blog post作为灵感来构建您需要的查询。

其他可能性是检索类别中的每篇文章,并在客户端自己过滤前五名(PHP,Java,Python,你可以命名)。