SQL:按消息排序不起作用

SQL: Order by Messages doesn't work

为什么这个SQL代码不是运行?

user_chats

             id | user_id | to_user_id |  ad_id  | timestamp
----------------+---------+------------+---------+-----------
              1 |       1 |      6     |   13    |  1513516133

user_messages

             id | chat_id |    text    | user_id | timestamp
----------------+---------+------------+---------+-----------
              1 |       1 |    Hello   |    1    |  1513516133
              2 |       1 |    Hi!     |    6    |  1513516754

我想获取聊天记录并在 user_messages.timestamp 前订购它们。 我的 SQL 代码是:

SELECT user_chats.id,
       user_chats.timestamp,
       ad_id,
       title,
       user_chats.user_id
FROM   user_chats
       INNER JOIN ads
               ON ads.id = ad_id
WHERE  user_chats.user_id = "1"
        OR user_chats.to_user_id = "1"
ORDER  BY (SELECT id
           FROM   user_messages
           WHERE  chat_id = user_chats.id
           ORDER  BY user_messages.id DESC) 

问题是您在 Order By 子句中使用了子查询:由于主查询中每条记录的 returns 多个结果,因此不能用于对主查询的结果进行排序。

我认为您正尝试按每次聊天中的最新消息对结果进行排序,但只需加入 user_messages table 就意味着您将得到重复的结果(每次聊天返回一次每条消息)。您可以通过加入内联视图来解决此问题:

SELECT DISTINCT user_chats.id,
       user_chats.timestamp,
       ad_id,
       title,
       user_chats.user_id
FROM   user_chats
       INNER JOIN ads
               ON ads.id = ad_id
       LEFT JOIN   
         --in line view aliased 'UM' returns one row per chat_id in user_messages, with the last timestamp for that ID
                  (SELECT max(timestamp) LastMessage, 
                  chat_id
                  FROM user_messages
                  GROUP BY chat_id) um
               ON um.chat_id = user_chats.id
WHERE  user_chats.user_id = 1
        OR user_chats.to_user_id = 1
ORDER  BY um.LastMessage desc