我有什么只能被描述为一个看似简单的问题,很可能是一个简单的解决方案;然而那个简单的解决方案让我感到安慰我通过庞大的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 |
哦,请噢,请给我一个答案,我肯定会在没有一个人的情况下枯萎。
答案 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