GROUP BY table1.column_name ORDER BY table2.column_name

时间:2013-04-10 21:54:32

标签: php mysql group-by

我有一个帖子表和一个用户表,我有一张介于两者之间的关系表。一个用户可以有很多帖子等。

可以通过在帖子表的已加星标列中添加0或1来“加星标”。每个用户只会有一个帖子加星标,但有些用户没有加星标的帖子。

我需要创建一个查询,每个用户拉一个帖子(所以我使用'group by'),而那些帖子应该获得加星标的帖子,并非所有用户都会有一个已加星标的帖子,所以我不能只需使用

WHERE starred = 1

基本上我想通过加星标来对该组进行排序,这样如果有一个已经加星标的帖子,如果没有则收到正常的帖子。

这是我到目前为止所做的:

SELECT
   posts.post_title
FROM
   posts
INNER JOIN rel_company_post ON posts.post_id = rel_company_post.post_id
INNER JOIN companies ON rel_company_post.company_id = companies.company_id
GROUP BY companies.company_id
ORDER BY posts.starred DESC

2 个答案:

答案 0 :(得分:0)

首先,没有进一步的信息,你的中间表似乎是不必要的。在posts表中添加一个“company_id”列,以便直接查看帖子的所有者,并删除中间表。

第二,你正在寻找“最大”,即

选择max(已加星标),posts.post_title

如果你将company_id放在posts表中,你甚至不需要进行连接

您的整体查询将如此

从帖子中选择max(已加星标),post_title group by company_id

答案 1 :(得分:0)

如果我理解你的数据库是如何组织的,我认为你需要这样的东西:

SELECT
   COALESCE(
     MAX(CASE WHEN posts.starred=1 THEN posts.post_title END),
     MAX(posts.post_title)
   ) title
FROM
   posts INNER JOIN rel_company_post
   ON posts.post_id = rel_company_post.post_id
   INNER JOIN companies
   ON rel_company_post.company_id = companies.company_id
GROUP BY companies.company_id

如果有一个帖子已经凝视= 1,则CASE WHEN将返回标题,MAX将被评估为此标题。 COALESCE将返回此标题。

如果没有帖子加星标,那么第一个MAX将返回NULL,而coalesce将返回具有最大非加星标题的第二个MAX。