mysql加入问题,加入一对多关系中的最新记录

时间:2010-10-21 09:07:42

标签: sql database mysql join

我有一个简单的(希望)SQL问题,任何帮助都会非常多,非常感谢:)。

我有两张桌子,我想加入。

One Is Users,让我们说它叫做用户

一个是该用户的一种历史,比如称其为users_history。

这两者的关系是一个用户与多个 users_history 关系。

我想做的是一个查询,它连接表并将users_history中的最新记录加入到每个用户。

让我们说这些表是这样的,我简化了简洁。

用户

  • ID
  • 名称

users_history

  • ID
  • USER_ID
  • 日期

日期格式为YYYYMMDD。

最终结果是,我希望能够提取今天没有users_history记录的所有用户,例如今天是20101021。

非常感谢任何帮助! :)

3 个答案:

答案 0 :(得分:3)

尝试

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()

如果您不希望结果集中没有任何用户历史记录的用户,请将“LEFT JOIN”更改为“JOIN”

答案 1 :(得分:1)

如果您真正想要的是找到今天没有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()) - 但我建议将列类型更改为date/time type

答案 2 :(得分:1)

取出今天没有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;