我有一个记录地址更新历史的表,称为事务。模式类似于row_id(int,PK),user_id(int),address1(varchar),transdate(timestamp)。
我想查询表并为用户返回一行,显示最新的行(即最大时间戳),但如果address1列中有数据,我想要带有数据的最新行。如果此列中没有数据,则只有最新一行。
示例:
row_id user_id address1 transdate 1 70005 56 The Street 2010-08-25 09:15 2 70005 NULL 2010-08-25 10:04 3 70005 12 Some Road 2010-08-25 11:17 4 70005 NULL 2010-08-25 12:18
使用类似
的查询SELECT user_id, address1 FROM transaction t WHERE user_id = 70005 AND row_id = (SELECT MAX(row_id) FROM transaction ti WHERE ti.user_id = t.user_id)
返回的结果将是
user_id address1 70005 NULL
但我想要的是
user_id address1 70005 12 Some Road
因为这是某些数据的用户的最新行。
希望这是有道理的。有没有人有什么建议?
我正在使用MySQL 5.1.49(社区)。感谢。
答案 0 :(得分:3)
SELECT user_id, address1
FROM transaction
WHERE user_id = 70005
ORDER BY ISNULL(address1) ASC, row_id DESC
LIMIT 1
这应该优先考虑包含数据的行,同时在address1
为NULL
时仍然有效。我还会使用transdate
代替row_id
。
答案 1 :(得分:2)
<强>已更新强>
SELECT user_id, address1
FROM transaction t
WHERE user_id = 70005
AND row_id =
IFNULL(
(SELECT MAX(row_id)
FROM transaction ti
WHERE ti.user_id = t.user_id AND address1 IS NOT NULL),
(SELECT MAX(row_id)
FROM transaction ti
WHERE ti.user_id = t.user_id )
);
答案 2 :(得分:0)
看看this question上接受的答案(不是我的回答,他的更好)
通过将结果与地址结合,然后将结果与没有地址的结合,您可以确定优先次序并仍使用简单的子查询连接。
请注意,您正在抓取max row_id,而不是最大日期,因此即使您这样做,也无法获得预期的结果。
答案 3 :(得分:0)
SELECT user_id, address1
FROM transaction t
WHERE user_id = 70005
ORDER BY case when address1 is not null then 0 else 1 end, transdate desc
limit 1