0

クエリで取得したい 2 つの ID を含むテーブルがあり、それらを区別したいと考えています。ただし、列間で区別したいので、次のようにします。

| column1 | column2 |
|    2    |    3    | row1
|    2    |    4    | row2
|    3    |    2    | row3
|    3    |    2    | row3

行 1 と行 2 を返す必要があります。何か助けはありますか?

編集:

申し訳ありませんが、それはちょっと漠然としていて、投稿するときに急いでいました. したがって、これらの列はどちらも同じテーブルを参照する ID です。これをユーザー間のメッセージと考えてみましょう。問題のテーブルはメッセージであり、ID はユーザー ID (送信者用、受信者用) です。したがって、メッセージ テーブルは次のようになります。

| sender_id | receiver_id |
|    2      |    3        | message1
|    2      |    3        | message2
|    3      |    2        | message3

各ユーザーは好きなだけ他のユーザーにメッセージを送ることができるので、各ユーザー間で多くのメッセージを送ることができます。特定のユーザーがメッセージを送信したユーザーを知りたい。したがって、ID 2 のユーザーが誰にメッセージを送信したかを調べるためのクエリが必要です。したがって、この理論上のクエリは、ユーザー ID 2 を指定すると、ユーザー ID 3 のみを返す必要があります。実際には、検索しているこれらのメッセージは気にしません。検索対象のユーザーではないメッセージに関連付けられているユーザーだけです。 、一意の値を持つリストが必要です。

私は次のようなことを試しました:

SELECT sender_id, receiver_id FROM messages
WHERE sender_id = 2 OR receiver_id = 2
GROUP BY sender_id
GROUP BY receiver_id

SELECT DISTINCT sender_id, receiver_id FROM messages
WHERE sender_id = 2 OR receiver_id = 2

ただし、これらは ID の 1 つの個別のリストのみを返します。(つまり、ユーザー ID 3 が 2 回返されます)。これが役立つ十分な情報であることを願っています。

**

アップデート:

**

これは私が最終的に使用したクエリです:

SELECT DISTINCT other_user_id FROM (
  SELECT sender_id AS some_user_id,
         receiver_id AS other_user_id FROM messages
  UNION
  SELECT receiver_id AS some_user_id,
         sender_id AS other_user_id FROM messages
)
WHERE some_user_id = whatever_value
4

2 に答える 2

3

column1 と column2 が両方とも数値データ型であり、2 つの列を比較していると仮定すると、次を使用できます。

SELECT DISTINCT
    LEAST( column1 , column2 ) AS leastColumn,
    GREATEST( column1 , column2 ) AS greatestColumn
FROM yourTable

ただし、2 つの列に同じデータが格納されている場合、このテーブルは n:m 関係の一部であるため、これをさらに正規化することができるため、なぜこれを行う必要があるのか​​ 完全にはわかりません。さらに、これはデータセットが大きくなるにつれて恐ろしく非効率になりますが、特定の質問についてはこれで十分です。

于 2013-06-12T23:58:57.097 に答える