SQL - 如果该列中没有数据,则使用特定列中的数据获取最新行,或仅获取最新行

时间:2010-08-25 15:32:26

标签: sql mysql max

我有一个记录地址更新历史的表,称为事务。模式类似于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(社区)。感谢。

4 个答案:

答案 0 :(得分:3)

SELECT    user_id, address1 
FROM      transaction
WHERE     user_id = 70005
ORDER BY  ISNULL(address1) ASC, row_id DESC
LIMIT     1

这应该优先考虑包含数据的行,同时在address1NULL时仍然有效。我还会使用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