2011-06-06 81 views
2

我不是SQL方面的专家,所以我在这里问有关下列情况下,一些帮助:MySQL的“帮助一个复杂的ORDER BY查询

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

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

谢谢你的帮助!

+0

每个任务都会在“活动”表中有一个条目吗?排序中活动和任务创建日期的优先顺序是什么?请将这些表格作为[示例SQL代码](http://sscce.org/)发布。请注意,您可以[将行格式化为代码](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)缩进四个空格。编辑器工具栏中的“{}”按钮可以为您做到这一点。单击编辑器工具栏中的橙色问号以获取更多信息和格式化提示。 – outis 2011-06-06 00:35:06

+0

最后,我在我的任务表中添加了一个名为“updatedat”的新列,并且当我更改任务标题或描述时以及在向其添加新活动时设置此列... – 2011-06-16 22:51:12

回答

2

要订购由最近的活动或创建日期的任务,如果没有对工作没有任何活动:

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 
+0

实际上,它必须是在日期/时间字段DESCENDING命令...该人希望最近在上面的条目分类BOTH .. – DRapp 2011-06-06 00:50:45

1

我认为这是你在找什么,如果你想显示所有即使他们没有任何活动也是如此。

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 *不是最好的主意。它现在可能会满足您的需求,但如果您要构建更多查询,则需要指定要显示的列,如我的示例中所示。