我正在尝试对A列进行分组,但也按列B对组进行排序。我无法让它工作。我也想加入另一张桌子。
select t.*, db_users.user as username, db_users.thumbnail
from
(
SELECT db_chats.* FROM db_chats WHERE db_chats.user = 'utQ8YDxD6kSrlI5QtFOUAE4h'
group by db_chats.partner
order by db_chats.timestamp desc
)
as t
inner join db_users on t.partner = db_users.id
此查询只给我一行,而不是按分组列的时间戳排序。我怎样才能让它发挥作用?
这是 sqlfiddle
预期结果:
2 rows
user partner timestamp
------------------------ ------------------------ -------------------
utQ8YDxD6kSrlI5QtFOUAE4h 6h4rpXOXMB456CJOz8elP2zM
utQ8YDxD6kSrlI5QtFOUAE4h D5RgVSRdbp9kPp9ua9q9rtdf 1413572130 sorted!!!
答案 0 :(得分:1)
假设您在给定用户的每个合作伙伴的最后一条聊天消息之后......
我们需要获取一组数据,其中包含每个用户伙伴的最大时间戳(因此内部选择)
然后我们将其加入聊天表,以获得所有其他所需的属性。
您的初始查询无效的原因是因为您没有将结果限制为聚合(Max),这就是为什么我很难理解为什么需要分组。
一旦你用纯文本英语澄清了你所追求的并提供了例子,我们就可以弄清楚。
SELECT A.*, DU.user as username, du.thumbnail
FROM DB_CHATS A
INNER JOIN (
SELECT max(timestamp) TS, user, partner
FROM db_chats
GROUP BY user,partner) T
on A.TimeStamp=T.TS
and A.user=T.User
and A.Partner = T.Partner
LEFT JOIN db_users DU on t.partner = DU.id
WHERE A.user = 'utQ8YDxD6kSrlI5QtFOUAE4h'
我认为这是你之后(更新) http://sqlfiddle.com/#!2/8abcac/16/0
我使用了左连接,因为合作伙伴在db_users中删除了帐户,但DB_Chats中仍然存在记录。
您可能希望使用INNER JOIN来排除系统中不再存在的DB_USERS但是...您不会打电话给我不知道需要。
答案 1 :(得分:1)
SELECT t1.* FROM db_chats t1
WHERE t1.user = 'utQ8YDxD6kSrlI5QtFOUAE4h'
AND NOT EXISTS (SELECT 1 FROM db_chats t2
WHERE t2.user = t1.user
AND t2.partner = t1.partner
AND t2.timestamp > t1.timestamp);
答案 2 :(得分:0)
你可能想要这个:
select t.*, db_users.user as username, db_users.thumbnail
from
(
SELECT db_chats.* FROM db_chats
group by db_chats.partner
)
as t
inner join db_users on t.partner = db_users.id
order by t.timestamp desc