【问题标题】:mysql query order by last postmysql 查询按上一篇文章的顺序
【发布时间】:2012-08-15 02:47:25
【问题描述】:

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

【问题讨论】:

  • 您的标题指的是订单,但您的问题是订单没问题,您遇到了重复问题。这里真正的问题是什么?
  • 因为我只想按为每个主题添加的最后评论进行排序,而不是针对与这些主题相关的所有 cmets,因为然后我得到示例“topic1 topic2 topic2 topic1 topic3 topic2”

标签: php mysql sql database


【解决方案1】:

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 

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

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


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

【讨论】:

  • 这个答案使用 ANSI-92 语法和 INNER JOIN 因为 20 年应该足以让标准安定下来。 (更不用说现在所有提供商都建议不要再使用, 语法了……)
  • 嘿,谢谢回答,它现在工作得很好:),我没有使用内连接,因为我记得一些大学课程不利于 sql 优化,我不确定我是否记得好,但无论如何它现在正在正常工作:D
  • @SimaCristianAlexandru 。 . .你的大学课程错了。事实上,正确的语法只能帮助 SQL 引擎为查询找到最佳优化。
  • 虽然这 mySQL 特定的,因为大多数(全部?)其他 RDBMS 提供者会因为没有聚合/分组所有选定的列而要求您。虽然你在这里应该没问题,只要只使用来自discussion 的列,而不使用来自comments 的列(当然,没有discussion.id 的重复项)。
  • @x-zero - All 可能是真的。但正如这里使用的那样,我非常喜欢这个功能。如果查询引用 cmets 表,我希望 MySQL 抛出错误。功能强大,实施马虎(在我看来)
【解决方案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',而不是相反(至少,大多数人会期待这种格式)。
  • 尽量与您的实体(表)名称是单数还是复数保持一致。显然已经为此展开了圣战,但我看到的大多数建议都说要使它们变得单一(以表格中的 row 命名,而不是整个集合)。
  • 如前所述,只使用显式连接,不要使用逗号分隔的 FROM 子句(通常在 INNER JOINs 期间你还可以,但除此之外事情会变得很奇怪,因此请练习正确的行为那些时候)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    相关资源
    最近更新 更多