Mysql,左连接,只有第一条连接的记录-按日期
这个问题不是历史上第一次提出来的,但我还没有发现任何有用的东西。假设用户(A、B、C)可以有更多任务(清理、维护、编程),任务可以有状态(已启动、暂停、暂停、完成) 所以有多个任务状态,我只需要第一个,根据“dateat”-也许我想要第一个或最后一个记录。我试着使用Mysql,左连接,只有第一条连接的记录-按日期,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,这个问题不是历史上第一次提出来的,但我还没有发现任何有用的东西。假设用户(A、B、C)可以有更多任务(清理、维护、编程),任务可以有状态(已启动、暂停、暂停、完成) 所以有多个任务状态,我只需要第一个,根据“dateat”-也许我想要第一个或最后一个记录。我试着使用按用户名分组,主题表单,但它无法在订购时查看日期 编辑: 假设A没有任务,B有两个任务:一个状态为task1,三个状态为task2 所以这个返回它: user taskid subject dateat state A
按用户名分组,主题表单
,但它无法在订购时查看日期
编辑:
假设A没有任务,B有两个任务:一个状态为task1,三个状态为task2
所以这个返回它:
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
或
假设列
dateat
位于表tasks\u 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
包含日期的表是什么?似乎可以。我忘了说,我还需要那些没有状态(还没有开始)的任务。你能给样本记录期望的结果吗?把
internal
改成LEFT
join怎么样?谢谢,看起来很酷。你能解释一下braketc的内部是什么,内部连接(…)在哪里?或者就说这件事吧,我从来没见过
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;
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