1

这是我的 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"但它不起作用。

我怎样才能实现我的愿望?

4

5 回答 5

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

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

* 由其他用户编辑 *

您应该将 (primary key) 替换为主键列表或仅由 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) |
于 2012-08-06T18:52:44.560 回答
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) |

在 sql fiddle 尝试一下

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

于 2012-08-06T18:47:29.900 回答
1

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

于 2012-08-06T18:46:02.697 回答
1

假设你有id一个primary keywith auto_incrementin userstable,这应该可以解决问题:

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
于 2012-08-06T18:46:16.583 回答
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
于 2012-08-06T18:50:26.660 回答