1

多対多の関係Rがあります (2 つの列バインディング テーブル、両方の列が同じテーブルへの外部キーです)。x, yここで、 と のようなすべてのペアを見つけたいと思いx,y in Rますy,x in R。テーブルに数十万行が含まれている場合、最速の方法は何ですか? 私はmysqlを使用しています。

4

3 に答える 3

2
SELECT  LEAST(x, y) l, GREATEST(x, y) g
FROM    r
GROUP BY
        l, g
HAVING  COUNT(*) > 1
于 2012-06-01T18:26:20.590 に答える
2

おそらく最速の方法は次のとおりです。

select (case when x < y then x else y end) as themin,
       (case when x < y then y else x end) as themax
from (select distinct x, y from R) r
group by (case when x < y then x else y end), (case when x < y then y else x end)
having count(*) > 1

これにより x 値と y 値が並べ替えられるため、それらをグループ化すると、元の順序に関係なく正規の順序になります。

ペアがRテーブルですでに異なることがわかっている場合は、「個別の選択」を省くことができます。

別の方法は、ある種の自己結合です (明示的に、または IN または NOT IN を使用して)。いろいろな方法を試すことができますが、これがおそらく最速だと思います。

于 2012-06-01T18:29:39.323 に答える
0

自己結合を行います:

SELECT  *
FROM    R T1
        INNER JOIN R T2
            ON T1.X = T2.Y
            AND T1.Y = T2.X

補遺

重複した行 (つまり、1, 2 と 2, 1) を返したくない場合は、次を使用できます。

SELECT  *
FROM    R T1
        INNER JOIN R T2
            ON T1.X = T2.Y
            AND T1.Y = T2.X
WHERE   T1.X < T1.Y;

ただし、重複する行を返したくない場合は、Quassnoi のソリューションの方がパフォーマンスが良いと思われますが、これはデータと指標によって異なります。

于 2012-06-01T18:25:49.647 に答える