我有一个表格,其中有2个数字(int
)值(ID)为sender_id
和receiver_id
。
我尝试做的是将这些行分组为"对话"。之间的对话:
sender_id = 1, and receiver_id = 5,
是sender_id = 5
和receiver_id = 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 and 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"
答案 0 :(得分:0)
var MovedCars = _GetCarsAfterMove.Except(_GetCarsBeforeMove).ToList(); //Above error shows me here
答案 1 :(得分:0)
LEAST返回最低值,GREATEST值为最大值:
GROUP BY LEAST(sender_id, receiver_id), GREATEST(sender_id, receiver_id)