mySQL 查询 - 使用 GROUP 和 HAVING 的唯一值
mySQL query - unique value using GROUP and HAVING
这是我的示例数据:
id name source
--------------------------
1 aaa source1
2 bbb source1
3 ccc source1
4 ddd source1
5 aaa source2
6 bbb source2
3 ccc source2
4 ddd source2
7 eee source2
我正在尝试查询“name”的值只出现一次(唯一)的所有记录 - 因此所需的输出将是:
id name source
--------------------------
7 eee source2
我试过 GROUP BY name
和 HAVING
的组合,但没用
SELECT name, source, COUNT(*) AS total FROM data
GROUP BY name
HAVING total=1
有什么想法吗?
PS: 我如何过滤“来源”? WHERE source = "source2"
无济于事..
您需要将源添加到分组依据或将其从 select 中删除或将其放入聚合函数中,否则会引发错误。
您的查询有效,但 FULL_GROUP_By
所有不在 select 中的列都需要一个 aggregation function
CREATE TABLE data (
`id` INTEGER,
`name` VARCHAR(3),
`source` VARCHAR(7)
);
INSERT INTO data
(`id`, `name`, `source`)
VALUES
('1', 'aaa', 'source1'),
('2', 'bbb', 'source1'),
('3', 'ccc', 'source1'),
('4', 'ddd', 'source1'),
('5', 'aaa', 'source2'),
('6', 'bbb', 'source2'),
('3', 'ccc', 'source2'),
('4', 'ddd', 'source2'),
('7', 'eee', 'source2');
SELECT name, MIN(source), COUNT(*) AS total FROM data
GROUP BY name
HAVING total=1
name | MIN(source) | total
:--- | :---------- | ----:
eee | source2 | 1
db<>fiddle here
这是我的示例数据:
id name source
--------------------------
1 aaa source1
2 bbb source1
3 ccc source1
4 ddd source1
5 aaa source2
6 bbb source2
3 ccc source2
4 ddd source2
7 eee source2
我正在尝试查询“name”的值只出现一次(唯一)的所有记录 - 因此所需的输出将是:
id name source
--------------------------
7 eee source2
我试过 GROUP BY name
和 HAVING
的组合,但没用
SELECT name, source, COUNT(*) AS total FROM data
GROUP BY name
HAVING total=1
有什么想法吗?
PS: 我如何过滤“来源”? WHERE source = "source2"
无济于事..
您需要将源添加到分组依据或将其从 select 中删除或将其放入聚合函数中,否则会引发错误。
您的查询有效,但 FULL_GROUP_By
所有不在 select 中的列都需要一个 aggregation function
CREATE TABLE data ( `id` INTEGER, `name` VARCHAR(3), `source` VARCHAR(7) ); INSERT INTO data (`id`, `name`, `source`) VALUES ('1', 'aaa', 'source1'), ('2', 'bbb', 'source1'), ('3', 'ccc', 'source1'), ('4', 'ddd', 'source1'), ('5', 'aaa', 'source2'), ('6', 'bbb', 'source2'), ('3', 'ccc', 'source2'), ('4', 'ddd', 'source2'), ('7', 'eee', 'source2');
SELECT name, MIN(source), COUNT(*) AS total FROM data GROUP BY name HAVING total=1
name | MIN(source) | total :--- | :---------- | ----: eee | source2 | 1
db<>fiddle here