我有一个帖子表和一个用户表,我有一张介于两者之间的关系表。一个用户可以有很多帖子等。
可以通过在帖子表的已加星标列中添加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
答案 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。