1

dHello 你能帮我查询一下最近帖子的主题排序吗?我的意思是,当有人在上面发帖时,我希望某个主题能够排在首位。以下是表格:

讨论

  • id_discution
  • 姓名
  • id_category
  • 日期

注释

  • id_comment
  • id_user
  • 描述
  • 类型
  • id_discussion
  • 日期(时间戳)

这是我的代码,但我得到了重复的主题,但它们的顺序很好

select discussion.id_discution, discussion.name, discussion.id_category, 
    discussion.date, discussion.report, comments.id_comment, comments.id_pet_dem_des, 
    comments.date,comments.type 
from discussion,comments 
where discussion.id_discution=comments.id_discussion 
    AND type=3
order by comments.id_comment  desc
4

2 回答 2

2

对于那些感兴趣的人,这里有一个适用于所有 RDBMS 提供者的示例(尽管显然是 DB2 保留COMMENTTYPE......):

SELECT Discussion.discussionId, Discussion.title, 
       Discussion.categoryId, Discussion.startedAt -- + other columns
FROM Discussion
LEFT JOIN (SELECT discussionId, MAX(madeAt) as madeAt
           FROM Comment
           WHERE type = 3
           GROUP BY discussionId) as Most_Recent
ON Most_Recent.discussionId = Discussion.discussionId
ORDER BY COALESCE(Most_Recent.madeAt, Discussion.startedAt) DESC

(有一个有效的 SQLFiddle示例。)

其他注意事项:

  • 不要只将事物标记为“日期”——尽量具体——也不要用它们的数据类型来标记它们。使用诸如startedAt等之类的东西来说明清楚。
  • 我相信通常的做法是使用<entity_name> + 'Id',而不是相反(至少,大多数人会期待这种格式)。
  • 尝试与您的实体(表)名称是单数还是复数保持一致。显然已经为此进行了圣战,但我看到的大多数建议都说要使它们变得单一(以表格中的一行命名,而不是整个集合命名)。
  • 如前所述,只使用显式连接,不要使用逗号分隔的FROM子句(通常在 s 期间你还可以INNER JOIN,但除此之外事情会变得很奇怪,所以在这些时间练习适当的行为)。
于 2012-08-14T18:47:25.300 回答
2

GROUP BY讨论表的主键...

SELECT
  discussion.id_discution, discussion.name, discussion.id_category, discussion.date, discussion.report
FROM
  discussion
INNER JOIN
  comments
    ON  discussion.id_discution = comments.id_discussion
    AND type=3
GROUP BY
  discussion.id_discution
ORDER BY
  MAX(comments.date)  desc 

注意:我没有在子句中包含comments表中的任何数据。SELECT

这是因为您只希望每个讨论出现一次,但每个讨论可以有很多评论。您要么让讨论出现多次,并包含评论,要么在结果中不包含评论数据。


可以包含聚合值,例如COUNT(*)显示有多少评论,MAX(comments.date)以显示讨论的评论最近时间等。

于 2012-08-14T17:00:47.877 回答