1

所以这是我正在编写的应用程序的消息模块中的剥离表。

当我运行以下命令时,它按预期进行

SELECT * FROM messages WHERE to_user = 1 或 from_user = 1 GROUP BY from_user

返回

剧情是我只想拥有一个实例2 | 1 或 1 | 2 ,因为在我的应用程序中,我试图根据发送消息的用户名对消息进行分组。我尝试不使用 OR 子句,但是当 1 向 2 发送消息时,该消息不会出现,直到他从 2 得到回复。1 和 2 是来自 php 变量的动态

4

4 回答 4

3

由于您按用户名分组,我会选择一个有效的用户 ID 列表:

SELECT DISTINCT from_user FROM messages WHERE to_user = 1 
UNION
SELECT DISTINCT to_user FROM messages WHERE from_user = 1 

如果您不介意重复,则UNION ALL删除DISTINCT将提高性能。

于 2012-09-14T21:10:20.170 回答
2
  1. 您的查询结果中不能有聚合和非聚合字段。
  2. 您可以使用函数来形成元组(to_user,from_user):

    SELECT DISTINCT IF(from_user < to_user, from_user, to_user) AS first,
                    IF(from_user < to_user, to_user, from_user) AS second
    FROM   messages
    

(当然,未经测试)。

于 2012-09-14T21:12:24.053 回答
1

这有点棘手,但对我有用。

SELECT n.f, n.t
FROM
  (SELECT DISTINCT m.from_user AS f, m.to_user AS t
   FROM messages AS m
   WHERE (m.from_user = 1
          OR m.to_user =1)) AS n,
  (SELECT DISTINCT m.from_user AS f, m.to_user AS t
   FROM messages AS m
   WHERE (m.from_user = 1
          OR m.to_user =1)) AS m
WHERE n.f = m.t
  AND m.f = n.t
  AND n.f < m.f;
于 2012-09-14T22:34:21.210 回答
-1

你可以附加

HAVING to_user < from_user 
于 2012-09-14T21:11:57.650 回答