【问题标题】:SQL: Order by Messages doesn't workSQL:按消息排序不起作用
【发布时间】:2018-01-01 12:39:41
【问题描述】:

为什么这段 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) 

【问题讨论】:

  • 你是说代码没有运行,还是没有产生预期的结果?
  • 尝试删除最后一行并添加任何 user_chats.id, user_chats.timestamp, ad_id, title, user_chats.user_idorder by
  • 它给出一个错误:#1242 - 子查询返回超过 1 行

标签: php html sql sql-order-by


【解决方案1】:

问题是您在 Order By 子句中使用了子查询:因为这会为主查询中的每条记录返回多个结果,所以它不能用于对主查询的结果进行排序。

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

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

【讨论】:

  • #1054 - 'on 子句'中的未知列 'uc.id'
猜你喜欢
  • 2021-06-27
  • 2018-08-14
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多