2

次のエントリを持つ MySQL テーブルがあるとします。

1
2
3
2
5
6
7
6
6
8

「SELECT * ...」を実行すると、すべてのエントリが返されます。しかし、テーブル内に一度だけ存在するこれらのエントリのみを取得したいと考えています。値が 2 (2 回存在する) および 6 (3 回存在する) の行を結果から完全に削除する必要があることを意味します。

キーワード DISTINCT を見つけましたが、理解した限りでは、エントリが 2 回表示されるのを回避するだけで、完全にはフィルタリングされません。

COUNTでなんとかできると思いますが、試してみてもうまくいきませんでした。では、ここでの正しい SQL ステートメントは何ですか?

編集:それを明確にするために、私が取り戻したい結果は

1
3
5
7
8
4

4 に答える 4

6

次のように a句とCOUNT()組み合わせて使用​​できます。GROUP BYHAVING

SELECT yourCol
FROM yourTable
GROUP BY yourCol
HAVING COUNT(*) < 2

フィドルの例。

于 2013-01-06T09:53:43.403 に答える
5

GROUP BY と COUNT() を混在させたい。

列が 'id' で、テーブルが 'table' であると仮定すると、次のステートメントが機能します。

SELECT * FROM `table` GROUP BY id HAVING COUNT(id) = 1

これにより、重複する結果が完全に除外されます (たとえば、2 と 6 が除外されます)。

于 2013-01-06T09:59:52.837 に答える
2

3 つの方法。GROUP BYとの 1 つHAVING:

SELECT columnX
FROM tableX
GROUP BY columnX
HAVING COUNT(*) = 1 ;

相関NOT EXISTSサブクエリを持つもの:

SELECT columnX
FROM tableX AS t
WHERE NOT EXISTS
      ( SELECT *
        FROM tableX AS t2
        WHERE t2.columnX = t.columnX
          AND t2.pk <> t.pk             -- pk is the primary key of the table
      ) ;

最初の方法の改善 (主キーpk列とインデックスがある場合(columnX, pk):

SELECT columnX
FROM tableX
GROUP BY columnX
HAVING MIN(pk) = MAX(pk) ;
于 2013-01-06T10:12:58.317 に答える
1
select id from foo group by id having count(*) < 2;
于 2013-01-06T09:54:03.400 に答える