我有2个表,类别和文章,我想为每个类别获得5篇文章,表格如下:
category: id, name
articles: id, title, body, category_id
所以我通常做的是INNER JOIN,但是我得到了所有行,如何指定每个类别只需要5行,我想在SELECT中需要SELECT?
答案 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,你可以命名)。