1

我有一个帖子表和一个用户表,中间有一个表,其中包含两者之间的关系。一个用户可以有很多帖子等。

可以通过在帖子表的星号列中添加 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
4

2 回答 2

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

如果有一个帖子 stared=1,CASE WHEN 将返回该标题,MAX 将被评估为该标题。COALESCE 然后将返回此标题。

如果没有加星标的帖子,则第一个 MAX 将返回 NULL,并且 coalesce 将返回具有最大未星标标题的第二个 MAX。

于 2013-04-10T22:29:52.337 回答
0

首先,如果没有更多信息,您的中间表似乎是不必要的。在帖子表中添加“company_id”列,以便您可以直接看到帖子的所有者,并消除中间表。

其次,您正在寻找“最大”,即

选择最大值(加星标),posts.post_title

如果你把 company_id 放在帖子表中,你甚至不需要加入

因此,您的整体查询看起来像

选择 max(starred), post_title from posts group by company_id

于 2013-04-10T22:17:54.783 回答