动态列,一个值,GROUP BY和ORDER BY

时间:2013-11-14 16:19:39

标签: sql group-by

我需要在用户之间开发私人消息系统,这就是我想要做的事情:

我有一张如下表格:

id | from_user_id | to_user_id | message
1  | 1            | 2          | Hey n°1 !    <-- Me with user n°2
2  | 2            | 1          | Hey n°2 !    <-- Me with user n°2
4  | 1            | 3          | Hey n°3 !    <-- Me with user n°3
3  | 3            | 2          | Hey n°4 !

我们假设我是用户n°1,我希望获得我的最后一条消息“按用户分组”并按ID排序,作为讨论:

id | with_user_id | message
4  | 3            | Hey n°3 !
2  | 2            | Hey n°2 !

我尝试过像:

这样的请求
SELECT id, message,
       (CASE WHEN from_user_id = 1 THEN to_user_id ELSE from_user_id END) AS with_user_id
FROM privates
WHERE from_user_id = 1 OR to_user_id = 1
GROUP BY with_user_id
ORDER BY id DESC

但我得到了这个:

id | with_user_id | message
4  | 3            | Hey n°3 !
1  | 2            | Hey n°1 !

所以问题是它选择第一条用户为n°1而不是最后一条消息。

2 个答案:

答案 0 :(得分:1)

注意:这在MSSQL中不起作用,因为子查询中不允许使用OrderBy子句。如果您使用的是MSSQL,则可以使用与this问题中的答案类似的方法。

您需要在group by之前应用订单,因为group by语句将消息1和2分组并选择第一个消息。尝试这样的事情:

Select SQ.*
FROM (
    SELECT id, message,
       (CASE WHEN from_user_id = 1 THEN to_user_id ELSE from_user_id END) AS with_user_id
    FROM privates
    WHERE from_user_id = 1 OR to_user_id = 1
    ORDER BY id DESC
) AS SQ
GROUP BY SQ.with_user_id

以这种方式订购只会获得给定会话的最新消息。

答案 1 :(得分:0)

看起来您需要用户创建对话框的所有消息,请尝试按照选择

select id, from_user_id, to_user_id, message,
  from privates
 where from_user_id = 1
    or to_user_id = 1
 order by case
              when from_user_id = 1 then
               to_user_id
              else
               from_user_id
          end,
          id desc