0

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

我有一张如下表:

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 的第一条消息,而不是最后一条。

4

2 回答 2

1

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

您需要在 group by 之前应用 order 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

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

于 2013-11-14T16:25:13.987 回答
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
于 2013-11-14T16:34:48.973 回答