【问题标题】:order column from union select by another column从联合中排序列由另一列选择
【发布时间】:2018-11-23 13:21:13
【问题描述】:

我有一张桌子:

留言

id, user_from_id, user_to_id, send_date, message, is_readed

我想选择所有与我聊天的用户,所以我的查询如下所示:

SELECT user_from_id as user_id
FROM message
WHERE user_to_id=xxx
UNION
SELECT user_to_id
FROM message
WHERE user_from_id=xxx

..我有一个 user_id 的列表,问题是我找不到通过 send_data 订购这些 id 的方法,所以在该列表的开头我会有一个我最近聊天的用户

有人可以帮我吗?

【问题讨论】:

    标签: mysql sql sql-order-by union


    【解决方案1】:

    放弃union怎么样?

    SELECT (CASE WHEN m.user_to_id = xxx THEN m.user_from_id
                 ELSE m.user_to_id
            END) as user_id
    FROM message m
    WHERE xxx IN (m.user_to_id, m.user_from_id)
    ORDER BY m.send_date DESC;
    

    这可能不是您真正想要的,因为用户会在列表中出现多次。你真正想要的是:

    SELECT (CASE WHEN m.user_to_id = xxx THEN m.user_from_id
                 ELSE m.user_to_id
            END) as user_id
    FROM message m
    WHERE xxx IN (m.user_to_id, m.user_from_id)
    GROUP BY m.user_id
    ORDER BY MAX(m.send_date) DESC;
    

    【讨论】:

      【解决方案2】:
      with x as(
      SELECT user_from_id as user_id, send_date
      FROM message
      WHERE user_to_id=xxx
      UNION
      SELECT user_to_id, send_date
      FROM message
      WHERE user_from_id=xxx
      ) select user_id 
      from x 
      order by send_date
      

      这会将UNION 查询与send_date 列包装成一个变量,然后您可以从中SELECTORDER BY send_date

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-12
        • 2018-10-18
        • 1970-01-01
        相关资源
        最近更新 更多