mysql加入问题,加入一对多关系中的最新记录
问题描述:
我有一个简单的(有希望的)SQL问题给你,任何帮助将非常多,非常感谢:)。mysql加入问题,加入一对多关系中的最新记录
我有两张表,我想加入。
一个是用户,可以说,这就是所谓的用户
一个是那种用户的历史,可以说,它叫users_history。
这两个关系是一个用户对很多users_history的关系。
我想要做的是一个查询,它连接表并将users_history中的最新记录加入到每个用户。
可以说这些表是这样的,我简化为简洁。
用户
- ID
- 名
users_history
- ID
- user_id说明
- 日期
日期的格式YYYYMMDD。
最终的结果是,我想能够拉出来的所有用户不必为今天users_history记录谁,例如今天是20101021.
任何帮助将是非常感激地收到! :)
答
尝试
SELECT MAX(users_history.date), users.name FROM users
LEFT JOIN users_history ON users.id = users_history.user_id
GROUP BY users_history.user_id
HAVING MAX(users_history.date) < CURDATE()
如果你不希望谁不具备在结果ENY users_history记录的用户,改变“LEFT JOIN”到“加盟”
答
如果你真正想要的是找到用户没有user_history
条目今天,你可以使用像这样的子查询:
SELECT * FROM users WHERE NOT EXISTS (SELECT id FROM users_history WHERE user_id = users.id AND `date` = DATE(NOW()));
恕我直言,这是不是在你的主机加入和一些过滤更具可读性 语言。
编辑:从您的日期格式描述来看,您可能使用varchar
列来存储日期。在这种情况下,将DATE(NOW())
替换为“today”的适当字符串表示形式 - 尽管我建议将列类型更改为date/time type。
答
取出所有今天没有users_history记录的用户,例如今天是20101021。
select
u.*
from
users u
left outer join users_history uh on
u.id = uh.user_id and uh.history_date = curdate()
where
uh.user_id is null;
如果用户没有Users_history记录,则MAX(users_history.date)将为NULL,并且HAVING子句将失败。没有Users_history记录的用户满足要求并应该被选中。 – 2010-10-21 10:51:05
+1在HAVING条款中将最大日期与今天之前的日期合并应该照顾Paul在第一句中提到的问题。 – 2010-10-21 13:29:42