2016-08-24 34 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列 –