2

假设我有一个 MySQL 表,其中包含以下条目:

1
2
3
2
5
6
7
6
6
8

当我执行“SELECT * ...”时,我会取回所有条目。但我只想取回这些条目,它们在表中只存在一次。意味着值 2(存在两次)和 6(存在 3 次)的行必须完全从我的结果中删除。

我找到了一个关键字 DISTINCT,但据我了解,它只避免条目显示两次,它并没有完全过滤它们。

我认为它可以用 COUNT 以某种方式完成,但我所尝试的一切并没有真正成功。那么这里正确的 SQL 语句是什么?

编辑:为了澄清这一点,我想要回来的结果是

1
3
5
7
8
4

4 回答 4

6

您可以像这样与 a和 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”,表称为“表”,则以下语句将起作用:

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

这将完全过滤掉重复的结果(例如,它会去掉你的 2 和 6)

于 2013-01-06T09:59:52.837 回答
2

三种方式。一个GROUP BYHAVING

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 回答