sql select语句显示两列的不同组合

时间:2013-06-28 06:42:47

标签: mysql sql

我有一个sql Table Messages 它有 4列,这是

1. sno 
2. sender_id 
3. reciever_id 
4. message

如果其中任何一个等于1,我将发出一个SELECT语句,其中unique combination sender_id reciever_id 。 / p>

我还想要如果包含(1,3)的组合,则应忽略(3,1)

帮助将不胜感激

3 个答案:

答案 0 :(得分:3)

适用于大多数RDBMS的SQL:

SELECT DISTINCT
    CASE WHEN sender_id > reciever_id THEN reciever_id ELSE sender_id END,
    CASE WHEN sender_id > reciever_id THEN sender_id ELSE reciever_id END
FROM
    MyTable;

MySQL SQL方言(和ANSI SQL):

SELECT DISTINCT
    LEAST(sender_id, reciever_id)
    GREATEST(sender_id, reciever_id)
FROM
    MyTable;

编辑,@ Edper的评论

CASE条件发生变化,但THEN / ELSE列也需要交换

SELECT DISTINCT
    CASE WHEN sender_id > reciever_id THEN reciever_id ELSE sender_id END,
    CASE WHEN sender_id <= reciever_id THEN reciever_id ELSE sender_id END
FROM
    MyTable;

答案 1 :(得分:0)

试试这个:

SELECT
    a.sender_id ,
    a.reciever_id
FROM
    Messages a
LEFT JOIN Messages b 
    ON a.sender_id = b.reciever_id
    AND b.sender_id = a.reciever_id
WHERE
    b.sender_id IS NULL
GROUP BY
    a.sender_id ,
    a.reciever_id
ORDER BY 
    NULL

答案 2 :(得分:0)

create table #temp(sno int,sender_id int,reciever_id int)

插入#temp

选择'1','1','1'

联合所有

选择'2','2','2'

联合所有

选择'3','3','3'

联合所有

选择'1','1','1'

联合所有

选择'2','2','2'

联合所有

选择'3','3','3'

联合所有

选择'3','3','3'

联合所有

选择'1','1','3'

联合所有

选择'1','3','1'

联合所有

选择'1','4','1'

联合所有

选择'1','1','4'

----试试这个: -

使用T(sender_id,reciever_id,dis)

AS

( 选择sender_id,reciever_id,ROW_NUMBER()over(PARTITION BY(sender_id + reciever_id)order by(sender_id + reciever_id))as dis from #temp

其中(sender_id = 1或reciever_id = 1)

group by sender_id,reciever_id

SELECT sender_id,reciever_id FROM T

其中dis = 1