这个问题在历史上第一次没有提出,但我还没有发现任何有用的问题。让我们假设用户(A,B,C)可以拥有更多任务(清理,维护,编程),任务可以具有状态(已启动,暂停,暂停,完成)。
SELECT username,tasks.id,subject,dateat,state FROM users
LEFT JOIN tasks ON tasks.owner_id = users.id
LEFT JOIN tasks_histories ON tasks_histories.task_id = tasks.id
ORDER BY username ASC, subject asc, dateat desc;
select * from tasks_histories;
所以有多个任务状态,我只需要第一个,根据“dateat” - 也许我想要第一个或最后一个记录。我尝试使用GROUP BY username,subject form
,但之后它不会看日期订购。
编辑:
假设A没有任务,B有两个任务:task1有一个状态,task2有3个状态。
所以这会返回它:
user taskid subject dateat state
A null null null null
B 9 task1 2011 5
B 10 task2 null null
B 8 task3 2011 1
B 8 task3 2012 5
B 8 task3 2013 3
但我想要它:
A null null null null
B 9 task1 2011 5
B 10 task2 null null
B 8 task3 2011 1
或
A null null null null
B 9 task1 2011 5
B 10 task2 null null
B 8 task3 2013 3
答案 0 :(得分:1)
假设列dateat
位于表tasks_histories
上,下面的查询将返回基于dateat
的最新任务的结果。
SELECT username,
tasks.id,
subject,
dateat,
STATE
FROM users
INNER JOIN tasks
ON tasks.owner_id = users.id
INNER JOIN tasks_histories
ON tasks_histories.task_id = tasks.id
INNER JOIN
(
SELECT task_id, MAX(dateat) max_date
FROM tasks_histories
GROUP BY task_id
) a ON tasks_histories.task_id = a.task_id AND
tasks_histories.dateat = a.max_date
ORDER BY username ASC, subject ASC, dateat DESC;
更新1
SELECT x.*, y.*
FROM users x
LEFT JOIN
(
SELECT a.owner_id, a.subject,
b.dateat, b.state
FROM tasks a
INNER JOIN tasks_histories b
ON b.task_id = a.ID
INNER JOIN
(
SELECT task_id, MAX(dateat) max_date
FROM tasks_histories
GROUP BY task_id
) c ON b.task_id = c.task_id AND
b.dateat = c.max_date
) y ON x.id = y.owner_id