【问题标题】:mySQL > help for a Complex ORDER by querymySQL > 查询复杂 ORDER 的帮助
【发布时间】:2011-06-06 00:26:18
【问题描述】:

我不是 SQL 方面的专家,所以我在这里请求一些关于以下案例的帮助:

我有 2 张桌子; 1 个表“任务”(ID,TITLE,CREATEDAT) 和 1 个表“活动”(ID,TASK_ID,TITLE,CREATEDAT),其中 CREATEDATDATETIME 列。

我想在任务和活动中列出按最后CREATEDAT 列排序的任务!我的意思是,有最近的任务(CREATEDATAND 有最近的活动,这样的任务和活动表的结合......)但我真的不知道如何处理?

感谢您的帮助!

【问题讨论】:

  • 每个任务在activity 表中都有一个条目吗?排序中活动和任务创建日期的优先顺序是什么?请将表格发布为sample SQL code。请注意,您可以通过缩进四个空格来format lines as code。编辑器工具栏中的“{}”按钮会为您执行此操作。单击编辑器工具栏中的橙色问号以获取有关格式设置的更多信息和提示。
  • 最后,我在任务表中添加了一个名为“updatedat”的新列,并在更改任务标题或描述以及向其中添加新活动时设置此列...

标签: mysql sql sql-order-by left-join


【解决方案1】:

如果任务没有活动,则按最近活动或创建日期对任务进行排序:

SELECT t.id, t.title 
  FROM task AS t
    LEFT JOIN activity AS a ON t.id=a.task_id
  GROUP BY t.id
  ORDER BY COALESCE(MAX(a.createdat), t.createdat) DESC

【讨论】:

    【解决方案2】:
    SELECT * FROM `task` T1 
        JOIN `activity` T2 ON T1.ID = T2.TASK_ID
        ORDER BY T1.CREATEDAT, T2.CREATDAT DESC
    

    【讨论】:

    • 实际上,它必须在日期/时间字段上以 DESCENDING 顺序排列...该人希望最近的两个条目分类都排在最前面..
    【解决方案3】:

    如果您想显示所有任务,即使它们没有活动,我认为这就是您要寻找的。​​p>

    sekect task.id, task.title, activity.id, activity.title
    from task
    left join activity
    order by task.createdat, activity.createdat desc
    

    编辑:我将提供一个简短的解释,可能会帮助您了解更多。

    这条语句基本上是告诉数据库抓取任务表和活动表中特定列“id”和“title”中的所有信息——这就是sekect task.id, task.title, activity.id, activity.title子句。

    任何查询都将始终使用from 关键字搜索至少一个表。在这种情况下,我们使用了from task,它将搜索任务表。但是,对于此示例,您需要两个表的并集,需要使用 join 关键字。使用join 允许我们以多种方式搜索多个表。在这种情况下,我们使用了left join;如果您想对此进行进一步解释,请发表评论。

    最后,我们只是按照任务创建日期,然后是活动创建日期对数据进行排序,并指定降序(最早的在前,最新的在后)。

    请注意,一般来说,使用select * 并不是最好的主意。它现在可能满足您的需求,但如果您要构建更多查询,则需要指定要显示的列,如我的示例所示。

    【讨论】: