2016-08-24 31 views
0

此我表一個聯合的結果使用ORDER BY和GROUP BY從2分不同的列

ID  Value   SenderID  RecieverID 
1  Hello There   2   7 
2  etc etc    7   5 
3  etc     2   6 
4  ee     7   2 
5  asdas    2   7 
6  asdas    2   5 
7  asdas    7   5 

我要的是無論從senderID或receiverID從其中一個特定的值,讓說,所有行的值2在這些2列
我用這個查詢的發生

SELECT `SenderID` FROM `messages` WHERE `RecieverID` = 2 
UNION 
SELECT `ReceiverID` FROM `messages` WHERE `SenderID` = 2 

給人獨特的答案,但在錯誤的順序 這樣

ReceiverID 
7 
6 
5 

我期待這個查詢的答案由ID DESC排序,其中一個特定的發件人或接收者ID發生在我的表中,例如senderid 2和reverid 7之間的msg在ID 5和最近的ID btweend sendr2和6是在id 3和btweed sndr2和5它是ID 7 sot上面的答案應該像這樣排序5,7,6而不是7,6,5

+0

你大概的意思是 「5,7,** 6 **,而不是7,6,5」。所以你想通過最近的談話訂購? –

+0

是的,這是一個錯字,更正了它 –

回答

1

這人會通過他們最近的談話訂購發送/接收器的ID:

SELECT senderID -- , MAX(ID) as maxID -- uncomment to see maxID 
FROM (
    SELECT ID, `SenderID` FROM `messages` WHERE `RecieverID` = 2 
    UNION ALL 
    SELECT ID, `RecieverID` FROM `messages` WHERE `SenderID` = 2 
) as sub 
GROUP BY (SenderID) 
ORDER BY MAX(ID) DESC 

http://sqlfiddle.com/#!9/6d7bc0/1

+0

哇,真棒的人你真棒。這是我在這裏努力工作,並且使用了我的大腦自從過去四個小時以來所擁有的所有力量,並且無法找到您在很短的時間內給出的解決方案,非常感謝。我猜這是因爲我確定聯盟並不是正確的選擇,只用聯盟測試所有不同的東西 –

+0

聯盟是沒有必要的。 Mikes答案也可以使用'ORDER BY MAX(ID)DESC'([sqlfiddle](http://sqlfiddle.com/#!9/6d7bc0/5)),但可能會變慢。 –

1

您需要在括號內使用內部查詢爲了設置什麼用的順序是指:

SELECT id, senderID from 
    (SELECT ID, `SenderID` FROM `messages` WHERE `RecieverID` = 2 
    UNION 
    SELECT ID, `RecieverID` as senderId FROM `messages` WHERE `SenderID` = 2 
) as A 
GROUP BY (SenderID) 
order by ID ASC 
+0

給錯誤#1248 - 每個派生表必須有它自己的別名 –

+0

所以給它一個名字(請參閱我的編輯) –

+0

謝謝它的工作,但只是一個小問題,因爲我不需要身份證從ID列如果我從主(外)選擇它會影響訂單?或不 ?? –

0
SELECT ID, IF(`SenderID` = 2,`RecieverID`,`SenderID`) 
    FROM `messages` 
WHERE `RecieverID` = 2 OR `SenderID` = 2 
group by IF(`SenderID` = 2,`RecieverID`,`SenderID`) 
order by ID ASC 
+0

不確定查詢的功能,但它沒有給我SenderID和ReceiverID的唯一ID列 –