douchuo0730 2018-01-01 12:39
浏览 94
已采纳

SQL:按消息排序不起作用

why does this SQL Code not run?

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

I want to get the Chats and order them by user_messages.timestamp. My SQL Code is:

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) 
  • 写回答

1条回答 默认 最新

  • dsds33222 2018-01-01 13:14
    关注

    The issue is that you've used a subquery in your Order By clause: as this returns multiple results for each record in the main query it cannot be used to order the results of the main query.

    I think you're trying to order the results by the latest message in each chat, but simply joining the user_messages table will mean you'll get duplicates (each chat being returned once per message). You can get around this by joining to an inline view:

    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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效