[英]SQL group by with two columns
我面临一个非常有趣的问题。 希望你有答案。
首先看我的表结构
id | sender | receiver | msg
1 | 10 | 5 | hello
2 10 5 df
3 5 10 fds
4 10 7 sdf
现在,我只想从发送者和接收者中选择不同的对(不是5,10或10,5,因为两者相同)
我正在使用SELECT * FROM
消息,其中WHERE sender=10 or reciever = 10 GROUP by sender,reciever
但这返回WHERE sender=10 or reciever = 10 GROUP by sender,reciever
和5,10,但我只想要一个。 请帮忙
mySQL没有分析功能,这会使事情变得很简单。 但是我们可以模拟它们。 我可以使用row_number over(由user1,user2划分),但是在mysql中,我们使用3个用户变量来模拟这一点。
最里面的查询(别名A)定义了两个新列user1和user2。 它确保user1总是小于user2,这给了我一种方法来对反向对进行分组((10,5),(5,10))
然后,使用子查询(别名B)中生成的user1和user2,将此查询的结果分配给每个发送方接收者组一个行号。
最后,第二子查询的结果被限制为仅显示第一行,并返回正确的有序发送方对接收方。
这将分解查询并显示每个子查询的结果,有助于解释其工作原理: http : //rextester.com/CTD16984
这为我们提供了以下SQL语句。
SELECT ID, Sender, Receiver
FROM (SELECT A.*
, Case when user1 = @user1 and user2 = @user2 then @RN:=@RN+1 else @RN:=1 end as RN
, case when user1 = @User1 then user1 else @user1:=user1 end u1
, case when user2 = @User2 then user2 else @user2:=user2 end u2
FROM (SELECT ID, sender, receiver
, case when Sender < Receiver then Sender else Receiver end user1
, case when Sender > Receiver then Sender else Receiver end user2
FROM SQLFOo) A
cross join (Select @RN:=0, @User1:='', @user2:='') b
ORDER BY U1, U2, ID
) C
WHERE RN = 1
#based on last comment is this what you mean?
# AND (Sender = 10 or receiver = 10);
这个怎么样...
SELECT * FROM messages WHERE receiver NOT IN
(SELECT sender FROM messages WHERE sender = 10 or receiver = 10 GROUP by sender)
AND (sender = 10 OR receiver = 10);
这应该将内部查询中的所有对都包含在内,然后推论出发生冲突的唯一方法是,如果sender =接收者,而receiver =发送者,那么它将删除sender =接收者的匹配项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.