加入我有2个表,类别和文章,我想每个类别的5篇文章,这些表是这样的:的MySQL选择内有限制
category: id, name
articles: id, title, body, category_id
所以我通常做的是INNER JOIN,但我得到所有的行,我怎么能指定我只需要每个类别5行,我想它会需要一个SELECT内的SELECT?
加入我有2个表,类别和文章,我想每个类别的5篇文章,这些表是这样的:的MySQL选择内有限制
category: id, name
articles: id, title, body, category_id
所以我通常做的是INNER JOIN,但我得到所有的行,我怎么能指定我只需要每个类别5行,我想它会需要一个SELECT内的SELECT?
由于MySQL不支持windows功能,因此您可以在MySQL中使用group_concat
来破解您的查询。虽然它看起来不漂亮。
您可以使用this blog post作为灵感来构建您所需的查询。
其他可能性是检索类别中的每篇文章,并在客户端(PHP,Java,Python,您命名它)筛选前5名。
感谢@Pablo,我认为可能比从客户端做起更容易一些,但我估计它不会离开它! – Amin 2014-08-31 12:57:29
你可以使用排名查询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组
@downvoters谨慎解释downvote的原因 – 2014-08-31 14:16:48
此代码确实有效。但是,我怎么限制只搜索限制范围内的所有类别?就像我们有100个类别,但是我们只想显示前10个(限制0,10),然后是下10个(限制10,20)等文章?我用你的代码尝试了令人满意的LIMIT,但似乎不起作用,它返回所有类别。我想要在一个类别数据部分上执行inner join – voytez 2016-01-29 19:50:09
@voytez你可以针对你的问题提出一个新的问题,针对你的问题将会在from子句中使用一个子选择而不是像'from(select *从类别顺序由some_col限制0,10)作为c' – 2016-01-29 20:14:14
你用什么标准为你的“前5名”? – 2014-08-31 12:50:00
@JeffWatkins我有文章日期和ORDER BY日期DESC,但真的这并不重要,但现在,thx – Amin 2014-08-31 12:51:02
检查:[组内配额(每组最多N)](http://www.artfulsoftware.com/infotree/ qrytip.php?id = 104) – wchiquito 2014-08-31 13:00:36