Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql,左连接,只有第一条连接的记录-按日期_Mysql_Sql_Join_Left Join - Fatal编程技术网

Mysql,左连接,只有第一条连接的记录-按日期

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、C)可以有更多任务(清理、维护、编程),任务可以有状态(已启动、暂停、暂停、完成)

所以有多个任务状态,我只需要第一个,根据“dateat”-也许我想要第一个或最后一个记录。我试着使用
按用户名分组,主题表单
,但它无法在订购时查看日期

编辑:

假设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