SQL - 选择按日期排序的最后一行

时间:2012-08-06 18:39:31

标签: mysql sql

这是我的SQL:

"SELECT users.username, users.id_user, friends.name, friends.meet_date 
 FROM users INNER JOIN friends ON (users.id_user = friends.id_user) 
 GROUP BY username ORDER BY username";

这是我网页上的输出:

Username    Friend's Name    Meeting Date
George      Nicolas          2010
Man         Anatol           2008

现在,它只为每个用户选择数据库中的第一行。

每个表都有一个auto_increment,第一个表为id_user,第二个表为id_friend。

我想向每个用户展示最后见面的朋友。

我尝试添加order by "meet_date DESC",但它不起作用。

我怎么能实现我的愿望?

5 个答案:

答案 0 :(得分:4)

一个标准技巧是使用外部自联接:

 SELECT users.username, users.id_user, friends.name, friends.meet_date 
 FROM users 
 INNER JOIN friends ON (users.id_user = friends.id_user) 
 LEFT JOIN friends f2 ON friends.meet_date > f2.meet_date
 WHERE f2.(primary key) IS NULL
 GROUP BY username
 ORDER BY username

查找没有其他日期值更大的记录的日期。这避免了相关子查询和额外聚合的低效率;或者可疑的假设是,如果您想使用主键,则必须在会议日期顺序中添加记录。

*由其他用户编辑*

您应该用主键列表替换(主键),或者只用f2列替换:

SELECT users.username, users.id_user, friends.name, friends.meet_date 
 FROM users 
 left JOIN friends ON (users.id_user = friends.id_user) 
 LEFT JOIN friends f2 ON friends.meet_date > f2.meet_date
 WHERE f2.id_user IS NULL
 GROUP BY username
 ORDER BY username

查询按指定运行:

| USERNAME | ID_USER |   NAME | MEET_DATE |
-------------------------------------------
|        a |       1 |      c |         0 |
|        b |       2 | (null) |    (null) |

答案 1 :(得分:3)

简单的方法是子查询:

 SELECT 
   users.username, 
   users.id_user, 
   ( select friends.name  
     from friends 
     where (users.id_user = friends.id_user) 
     ORDER BY friends.meet_date desc
     LIMIT 1 ) as friend_name,       
   ( select friends.meet_date
     from friends 
     where (users.id_user = friends.id_user) 
     ORDER BY friends.meet_date desc
     LIMIT 1 ) as friend_meet_date
 FROM users 
 ;

*测试*

create table users (username varchar(50), id_user int);
create table friends ( name varchar(50), id_user int, meet_date int);

insert into users values ( 'a', 1),('b',2);
insert into friends values ('c', 1, 0), ('d',1,1);

结果:

| USERNAME | ID_USER | FRIEND_NAME | FRIEND_MEET_DATE |
-------------------------------------------------------
|        a |       1 |           d |                1 |
|        b |       2 |      (null) |           (null) |

Try it at sql fiddle

请注意,相关子查询不是一种优雅的方法,是一种简单的方法。

答案 2 :(得分:1)

你没有auto_increment字段吗?这将允许您按此排序。另一个选项是将meet_date更改为日期字段,以便您可以正确排序。没有理由将DateTime存储为varchar字段

答案 3 :(得分:1)

假设您在id表格中primary key auto_increment users,这应该可以解决问题:

SELECT MAX(users.id), users.username, users.id_user, friends.name, friends.meet_date 
 FROM users INNER JOIN friends ON (users.id_user = friends.id_user) 
 GROUP BY username ORDER BY username

答案 4 :(得分:0)

SELECT users.username, users.id_user, friends.name, friends.meet_date 
 FROM users INNER JOIN friends ON (users.id_user = friends.id_user) 
 GROUP BY username ORDER BY username
having max(friends.meet_date)=friends.meet_date