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

当我运行以下命令时,它按预期进行
SELECT * FROM
messagesWHERE to_user = 1 或 from_user = 1 GROUP BY from_user
返回

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

当我运行以下命令时,它按预期进行
SELECT * FROM
messagesWHERE to_user = 1 或 from_user = 1 GROUP BY from_user
返回

剧情是我只想拥有一个实例2 | 1 或 1 | 2 ,因为在我的应用程序中,我试图根据发送消息的用户名对消息进行分组。我尝试不使用 OR 子句,但是当 1 向 2 发送消息时,该消息不会出现,直到他从 2 得到回复。1 和 2 是来自 php 变量的动态
由于您按用户名分组,我会选择一个有效的用户 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将提高性能。
您可以使用函数来形成元组(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
(当然,未经测试)。
这有点棘手,但对我有用。
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;
你可以附加
HAVING to_user < from_user