2

这个问题在历史上不是第一次提出,我仍然没有发现任何有用的东西。让我们假设用户(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,但随后它不会观看 dateat 订购。

编辑:

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

1 回答 1

1

假设该列dateat位于 table 上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
于 2013-02-17T12:21:54.027 回答