2014-10-17 96 views
0

我正在尝试将A组分组,但也按B列排序组。我无法使其工作。另外我想加入另一张桌子。按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 

该查询仅给出1行,它不按分组列的时间戳排序。我怎样才能使这个工作?

这里是一个sqlfiddle

预期结果:

2 rows 
user       partner      timestamp 
------------------------  ------------------------ ------------------- 
utQ8YDxD6kSrlI5QtFOUAE4h  6h4rpXOXMB456CJOz8elP2zM  
utQ8YDxD6kSrlI5QtFOUAE4h  D5RgVSRdbp9kPp9ua9q9rtdf 1413572130 sorted!!! 
+0

所以你说你想要的组分类在一起,然后将组内排序tiemstamp? – xQbert 2014-10-17 20:02:17

+0

这些组不需要排序。只有在一个组内,它应按照时间戳排序 – Patrick 2014-10-17 20:03:16

回答

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,但是......您打电话时不知道需要。

+0

请参阅我的编辑,并编辑sqlfiddle – Patrick 2014-10-17 20:06:33

+0

您的查询不按伙伴分组 – Patrick 2014-10-17 20:08:14

+0

然后我如何通过聊天伙伴分组? – Patrick 2014-10-17 20:17:18

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 
+0

否我希望特定用户的所有聊天,然后在他的聊天伙伴组 – Patrick 2014-10-17 20:16:38

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

+0

它的作品!但是我错过了用户的连接,它将放置在哪里? – Patrick 2014-10-17 20:29:37

+0

试过,但失败,错误:'SELECT T1 *,db_users.user如用户名,db_users.thumbnail FROM db_chats T1 WHERE t1.user = 'utQ8YDxD6kSrlI5QtFOUAE4h' AND NOT EXISTS(SELECT 1 FROM db_chats t2的 其中t2。 user = t1.user AND t2.partner = t1.partner AND t2.timestamp> t1.timestamp) inner join db_users on t1.partner = db_users.id;' – Patrick 2014-10-17 20:35:12

+0

将INNER JOIN放在WHERE CLAUSE之前(即在t1和WHERE) – 2014-10-17 20:44:06