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”到“加盟”

+0

如果用户没有Users_history记录,则MAX(users_history.date)将为NULL,并且HAVING子句将失败。没有Users_history记录的用户满足要求并应该被选中。 – 2010-10-21 10:51:05

+0

+1在HAVING条款中将最大日期与今天之前的日期合并应该照顾Paul在第一句中提到的问题。 – 2010-10-21 13:29:42

如果你真正想要的是找到用户没有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;