1

同様に構造化されたデータを含む 2 つのテーブルから一致するペアを選択する必要があります。ここでの「一致したペア」とは、「一致」列で相互に参照する 2 つの行を意味します。

単一テーブルのマッチしたペアの例:

TABLE
----
id | matchid
1  |   2
2  |   1

ID 1 と 2 は、それぞれが他方の一致エントリを持っているため、一致するペアです。

本当の問題: 両方のテーブルに表示される一致したペアを選択するための最良の (最速の) 方法は何ですか:

Table ONE (id, matchid)
Table TWO (id, matchid)

サンプルデータ:

ONE                TWO
----               ----
id  | matchid      id  | matchid
1   |   2          2   |   3
2   |   3          3   |   2
3   |   2
4   |   5
5   |   4

目的の結果は、ID が 2 と 3 の単一の行です。

RESULT
----
id  | id
2   | 3

これは、テーブル ONE とテーブル TWO で 2 と 3 が一致するペアであるためです。4 と 5 は、テーブル ONE では一致するペアですが、TWO では一致しないため、それらを選択しません。2 には 1 に一致するエントリがないため、1 と 2 は一致ペアではありません。

これを使用して、1 つのテーブルから一致したペアを取得できます。

SELECT a.id, b.id 
    FROM ONE a JOIN ONE b
       ON a.id = b.matchid AND a.matchid = b.id
    WHERE a.id < b.id

両方のテーブルに表示される一致するペアのみを選択するクエリを作成するにはどうすればよいですか?

するべきか:

  • 各テーブルに対して上記のクエリを選択し、一緒に WHERE EXISTS?
  • 各テーブルに対して上記のクエリを選択し、それらを結合しますか?
  • 上記のクエリを選択してから、「id」に対して 1 回、「matchid」に対して 1 回、JOIN テーブル TWO を 2 回実行しますか?
  • 各テーブルに対して上記のクエリを選択し、ループしてそれらを php で比較しますか?
  • どういうわけか、テーブル 2 をフィルター処理して、テーブル 1 の一致したペアの ID だけを調べればよいのでしょうか?
  • まったく違うことをする?

(これは効率の問題であるため、一致は非常にまばらで、おそらく 1/1000 以下であり、各テーブルには 100,000 行以上あることに注意してください。)

4

3 に答える 3