我有一个表,其中有 2 个数字 (int
) 值 (ID),分别为 sender_id
和 receiver_id
。
我想做的是将这些行分组为“对话”。之间的对话:
sender_id = 1, and receiver_id = 5,
与 sender_id = 5
和 receiver_id = 1
因此,当我获取数据库行时,我希望每个对话只包含 1 行。
我将为特定用户获取这些对话。用户 ID(我已经知道,将其称为 userId
)可以位于 sender_id
和 receiver_id
中。
所以我的算法会是这样的:
Select All rows
from Database,
where sender_id = userId OR receiver_id = userId,
group by sender_id+user_id
结果行必须包含另一列值(不是等于 userId
的值),但它可以同时包含两者,我必须通过将它们与 userId 进行比较来检测另一列我有。
说实话,我一直对 SQL 手册感到不舒服。由于某种原因,我无法从那里找到我需要的东西。原谅我..
我不确定是否应该创建临时表或使用 SQL SUM 函数,或者是否可以使用类似 GROUP BY sender_id+receiver_id
更多信息(不确定是否相关):
我正在使用 PHP
该表还有一些列,例如 record_id、create_date 和 read_date
非常感谢您的帮助和回复。
更新: 我的问题的解决方案标记如下。但是,我遇到了另一个问题,我想分享一下,因为它可能有助于稍后查看此问题的人。
我面临的问题是,当我显示对话时,我想显示最后一条消息行。现在,当分组完成后,分组将堆叠在找到的第一行上。我想要相反的。我希望返回的行包含每个对话的最后一条消息行。
我可以通过以下查询来做到这一点。请注意,这只是一种方法,我还不确定该查询的性能。我稍后会对其进行测试,并根据需要进行更新。
$this->id 是我想要显示其对话的用户的 ID。
"SELECT t1.* FROM table t1
INNER JOIN (
SELECT sender_id, receiver_id, max(create_date) lastCreateDate
FROM table
WHERE receiver_id = ".$this->id." OR sender_Id = ".$this->id."
GROUP BY GREATEST(sender_id ,receiver_id), LEAST(sender_id,receiver_id)
) t2
ON ((t1.sender_id = t2.sender_id
OR t1.sender_id = t2.receiver_id)
AND t1.create_date = t2.lastCreateDate)
ORDER BY create_date DESC LIMIT 0,15"
最佳答案
LEAST 返回最小值,GREATEST 返回最大值:
GROUP BY LEAST(sender_id, receiver_id), GREATEST(sender_id, receiver_id)
关于php - Mysql - 选择并分组具有 A 列和 B 列的行,其中 A.value 和 B.value = x 和 y 或 y 和 x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30289568/