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

时间:2013-02-17 12:18:14

标签: mysql sql join left-join

这个问题在历史上第一次没有提出,但我还没有发现任何有用的问题。让我们假设用户(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

1 个答案:

答案 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