2014-08-31 67 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