簡體   English   中英

SQL按兩列分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM