1

私はSQLを持っています。Table Messages それには4つの列があります

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

いずれかが 1 に等しい場合、 sender_idreceiveer_idの aであるSELECTステートメントを作成する必要があります。unique combination

また、 (1,3)の組み合わせが含まれている場合、(3,1)は無視する必要があります。

助けていただければ幸いです

4

3 に答える 3

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;
于 2013-06-28T06:52:43.980 に答える
0

テーブル #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)を使用

なので

( select 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)

sender_id、reciever_id でグループ化

)

T から送信者 ID、受信者 ID を選択

ここで、dis=1

于 2013-06-28T09:20:03.900 に答える
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
于 2013-06-28T06:53:40.077 に答える