7

2つの列を持つテーブルがあります。

  1. person_id
  2. 1番目のフィールドIDが連携しているperson_id

すべての協力ペアを選択する必要があります。簡単ですが、問題は次のとおりです。テーブルには次のようなデータがあります:987- 102、、、。そのようなデータの結果として、私は3つの協力ペア、、、を持っているはずです。ご覧のとおり、レコードは同じロジックを持っています。どうすればそれらの重複を避けることができますか。何か案が?103 - 104104 - 10321 - 102987 - 102103-10421-102103 - 104104 - 103

よろしくお願いします。アントン。

4

2 に答える 2

10

MySQL のLEAST()およびGREATEST()関数を以下と一緒に使用できDISTINCTます。

SELECT DISTINCT LEAST(a, b), GREATEST(a, b) FROM mytable
于 2012-07-02T17:59:01.787 に答える
3

各「ペア」の要素の順序を維持することが重要でない場合は、eggyal からの回答を参照してください。そのクエリは、指定したものとはわずかに異なる結果セットを返します。102-987の代わりにペアを返します987-102。また、テーブルに表示される「重複」ペアを排除します。

各ペアの要素の順序を維持すること重要であり、これらの「一致する」ペアの両方が存在するときに「大きい - 小さい」ではなく「小さい - 大きい」を返したい場合は、次のようなものを使用できます。

SELECT c.col1, c.col2
  FROM mytable c
  LEFT
  JOIN mytable d ON d.col1 = c.col2 AND d.col2 = c.col1 AND d.col1 <> d.col2
 WHERE (d.col1 IS NULL OR d.col1 > c.col1)

すべての重複ペアと「一致する」ペアを削除するには、GROUP BY 句または DISTINCT キーワードを追加します。

SELECT c.col1, c.col2
  FROM mytable c
  LEFT
  JOIN mytable d ON d.col1 = c.col2 AND d.col2 = c.col1 AND d.col1 <> d.col2
 WHERE (d.col1 IS NULL OR d.col1 > c.col1)
 GROUP BY c.col1, c.col2

ノート:

SQL フィドル: http://sqlfiddle.com/#!2/1d9e7/1およびここ: http://sqlfiddle.com/#!2/1d9e7/2

比較演算子は null セーフではありません。col1 または col2 に NULL 値が含まれている場合、必要な結果セットが返されない場合があります。(クエリは、col1 および/または col2 の NULL 値を処理するように変更できます。) 記述されているように、両方のクエリは、たとえば、「一致する」「ペア」がテーブルにある場合と両方(1,NULL)を返します。(NULL,1)(要するに、NULL 値が一致すると見なすかどうかという問題になります。)

また、両方のクエリが行を返すことに注意してくださいcol1=col2

最初のクエリは、テーブルに存在する「重複」行を排除しないことに注意してください。つまり、重複した「ペア」(202,101)が 2 つの異なる行にある場合など、両方が返されます (クエリが「一致する」ペアを持つ行を少なくとも 1 つ返さない限り: (101,202).)

これらの場合に返される結果セットが明確ではなかったため、最初のクエリは(larger,smaller)、一致する(smaller,larger)ペアが結果セットにある場合にのみ行を削除するパターンを示しています。

2 番目のクエリは、すべての重複と「一致する」ペアを排除します。

于 2012-07-02T18:51:44.387 に答える