Mysql - Select&将行与A列分组,B列为A.value和B.value = x和y或y和x

时间:2015-05-17 17:00:52

标签: php mysql sql

我有一个表格,其中有2个数字(int)值(ID)为sender_idreceiver_id

我尝试做的是将这些行分组为"对话"。之间的对话:

sender_id = 1, and receiver_id = 5,

sender_id = 5receiver_id = 1

的对话

因此,当我获取数据库行时,我希望每个对话只有一行。

我将为特定用户获取这些对话。用户ID(我已经知道并将引用为userId)可以在sender_idreceiver_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"

2 个答案:

答案 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)