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が、注文した日付が表示されません。

編集:

Aにタスクがないとすると、Bには2つのタスクがあります。1つの状態のtask1、3つの状態の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

また

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列がテーブルにあると仮定すると、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 に答える