哦MySQL,你如何按日期加入相关记录

时间:2014-01-28 06:24:46

标签: mysql

我有什么只能被描述为一个看似简单的问题,很可能是一个简单的解决方案;然而那个简单的解决方案让我感到安慰我通过庞大的StackOverflow网络进行了搜索和研究,结果却发现只有极其复杂的解决方案。我已经有点解决了这个问题,但是,这很恶心,我为此感到羞耻。当然还有一种更好的方法,因为必须有一个骑士穿着MySQL盔甲,挥舞着一个可以提出简单而优雅的解决方案的查询剑。这是:

为了这个问题,我们将保持这两个表格简单。

Table 1
users (user_id, active, name)

Table 2
user_projects (user_project_id, user_id, start_date, details)

在这种情况下,根据需要添加用户记录。然后在用户完成项目时添加相关记录。

我的问题是:如何使用查询,如何获得1条记录,其中包含表1中的所有活动用户与基于start_date的最近日期的记录连接的活动用户?

换句话说,如果我有这个:

| user_id | active | name  |
| 1       | 1      | brian |

和此:

| user_project_id | user_id | start_date | details |
| 1               | 1       | 2013-10-02 | proj 1  |
| 2               | 1       | 2013-11-26 | proj 2  |
| 3               | 1       | 2014-01-02 | proj 3  |

生成给我这个的查询:

| user_id | active | name  | user_project_id | user_id | start_date | details |
| 1       | 1      | brian | 3               | 1       | 2014-01-02 | proj 3  |

哦,请噢,请给我一个答案,我肯定会在没有一个人的情况下枯萎。

4 个答案:

答案 0 :(得分:3)

由于在MySQL中没有top选择器这样的东西,你可以使用三JOIN,如:

SELECT
  user_projects.*,
  users.*
FROM
  (SELECT 
    MAX(start_date) AS max_date, 
    user_id
  FROM
    user_projects
  GROUP BY
    user_id) AS max_dates
  LEFT JOIN
    user_projects 
      ON max_dates.max_date=user_projects.start_date
      AND max_dates.user_id=user_projects.user_id
  LEFT JOIN
    users
      ON users_projects.user_id=users.user_id

答案 1 :(得分:1)

首先选择每个用户最近的项目:

SELECT a.*
FROM user_projects a
JOIN (
  SELECT user_id, MAX(start_date) AS max_start_date
  FROM user_projects
  GROUP BY user_id
) b ON a.user_id = b.user_id AND a.start_date = b.max_start_date

它从user_projects创建一个小帮助者表,包括用户和每行最近的项目日期;要获取所有相应的表字段,您必须再次与user_projects一起加入。

然后,您只需加入users以上结果即可获得最终结果:

SELECT *
FROM users
JOIN (
  SELECT a.*
  FROM user_projects a
  JOIN (
    SELECT user_id, MAX(start_date) AS max_start_date
    FROM user_projects
    GROUP BY user_id
  ) b ON a.user_id = b.user_id AND a.start_date = b.max_start_date
) c ON users.user_id = c.user_id

答案 2 :(得分:0)

select u1.user_id, u1.name, u.strat_date, u.user_project_id, u.details
 from user_projects u
left outer join users u1 on u1.user_id=u.user_id
left outer join 
(select user_id, max(strat_date) as strat_date  user_projects group by user_id) as A
on A.user_id=u.user_id and A.strat_date=u.strat_date

答案 3 :(得分:-1)

您可以使用前1名和按日期排序

select top 1 a.user_id,a.name,b.user_project_id,b.user_id,b.start_date,b.details
from users a join users_project b on a.user_id = b.user_id
order by b.start_date desc

抱歉,我没有注意到OP问题中的mysql标签。您可以使用Limit关键字。

 select  a.user_id,a.name,b.user_project_id,b.user_id,b.start_date,b.details
from users a join users_project b on a.user_id = b.user_id
order by b.start_date desc Limit 1