按A分组但按B排序

时间:2014-10-17 19:59:32

标签: sql

我正在尝试对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!!!

3 个答案:

答案 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);

http://sqlfiddle.com/#!2/4f44b/27

答案 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