我有一个包含用户数据(例如名称,地址等)的表以及另一个包含关于用户的文本段的表。他们分开的原因是因为我们需要记录所有旧的数据。所以如果用户改变他们的段落 - 旧的仍然应该被存储。关于数据的每一位都有一个关于MeID的主键。我想要做的是有一个连接,从其他表中取出他们的名字,地址等和最新的aboutMe数据。MySQL获得最接近NOW()的行
我不确定我如何才能命令连接才能获取有关我的最新数据。
有人可以帮忙吗?
我有一个包含用户数据(例如名称,地址等)的表以及另一个包含关于用户的文本段的表。他们分开的原因是因为我们需要记录所有旧的数据。所以如果用户改变他们的段落 - 旧的仍然应该被存储。关于数据的每一位都有一个关于MeID的主键。我想要做的是有一个连接,从其他表中取出他们的名字,地址等和最新的aboutMe数据。MySQL获得最接近NOW()的行
我不确定我如何才能命令连接才能获取有关我的最新数据。
有人可以帮忙吗?
如果你有两个表加入,子查询要求与老款的表给刚刚过去的一个,按日期排序(datestamp DESC),并根据您的用户标识进行匹配。最后,外部查询将整个事件限制在有问题的用户(@UserID)中。
SELECT name, address, aboutme
FROM users
LEFT JOIN
(SELECT aboutme FROM oldertable
WHERE aboutMeID = users.id
ORDER BY datestamp DESC
LIMIT 1)
WHERE users.id = @UserID;
假设你已经与dateEntered场一列,你可以只说
select col1, col2, col3 from aboutme order by dateEntered desc limit 1
这会给你这是最新的行。
这是正确的,它已被修改 – Avitus 2010-05-10 17:54:11
你应该改变descendently的日期进行排序,并将其限制在一个记录(LIMIT 1)
子查询的变体:
select name,
address,
(select aboutme
from ABOUTTABLE
where USERDATA.userid = ABBOUTTABLE.userid order by datefield limit 1)
from USERDATA
这是相当棘手的,很可能是缓慢的,但它是通过依赖子查询完成。
SELECT name, address, aboutme.text as aboutme
FROM users
LEFT JOIN aboutme ON aboutMeID = (SELECT aboutMeID FROM aboutme
WHERE user_id = users.id
ORDER BY datestamp DESC
LIMIT 1)
不知道它是否比@JYelton解决方案更快,这是你必须测试自己。
我试过这样的查询,但得到错误消息user.id在子查询中是未知的。任何人都知道该怎么做? – Steve06 2011-10-18 12:39:02
将您的参数@UserID替换为users.id。内部查询实际上并不加入用户表。我需要编辑这个答案才是准确的。 – JYelton 2011-10-18 15:57:07
对于只存储特定用户信息的存储例程而言,这是有意义的。出于我的目的,我需要在子查询中处理的用户依赖外部查询中的当前用户(例如,如果我处理多个用户的记录) – Steve06 2011-10-18 16:57:51