这是我的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"
,但它不起作用。
我怎么能实现我的愿望?
答案 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) |
请注意,相关子查询不是一种优雅的方法,是一种简单的方法。
答案 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