最后一篇文章的mysql查询顺序

时间:2012-08-14 16:53:43

标签: php mysql sql database

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

2 个答案:

答案 0 :(得分: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),以显示评论最近评论的内容等等。< / p>

答案 1 :(得分: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 example。)

其他说明:

  • 不要只是将事物标记为“日期” - 尝试具体 - 并且不要用它们的数据类型标记它们。使用startedAt之类的东西来表达清楚。
  • 我认为通常的做法是使用<entity_name> + 'Id',而不是相反(至少,大多数人会期望这种格式)。
  • 尝试与您的实体(表格)名称是单数还是复数一致。显然是为此争夺了神圣的战争,但我见过的大多数建议都说它们是单数的(以表中的命名,而不是整个集合。)
  • 如前所述,只使用显式连接,不要使用逗号分隔的FROM子句(通常在INNER JOIN期间你没事,但事情变得奇怪,所以在那些时候练习正确的行为。)