【问题标题】:Mysql, left join with only first connected record - by a dateMysql,只有第一个连接记录的左连接 - 按日期
【发布时间】:2013-02-17 12:18:14
【问题描述】:

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

【问题讨论】:

  • 包含dateat的表是什么?

标签: mysql sql join left-join


【解决方案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

【讨论】:

  • 似乎没问题。忘了说,我也需要那些没有状态的任务(还没开始)
  • 你能给出想要结果的样本记录吗?把INNER改成LEFT加入怎么样?
  • 谢谢,看起来很酷。你能解释一下在 braetc, INNER JOIN ( ... ) ON 里面是什么吗?或者只是命名这个东西,我从来没有见过
猜你喜欢
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多