首页 > 解决方案 > 如何使用 MySQL 在表中显示唯一记录

问题描述

我正在尝试显示表中的所有唯一记录。

SQL 脚本:

CREATE TABLE certificate(
    id INT PRIMARY KEY,
    full_name VARCHAR(200),
    address VARCHAR(200),
    date_of_birth DATETIME,
    special_code INT,
    validity VARCHAR(200)
);

INSERT INTO certificate VALUES('1','Walter White','Albuquerque 87107','1970-10-10','1000','VALID');
INSERT INTO certificate VALUES('2','Skyler White','Albuquerque 87107','1978-10-10','1001','VALID');
INSERT INTO certificate VALUES('3','Jesse Pinkman','Santa Fé 28','1979-10-10','1002','INVALID');
INSERT INTO certificate VALUES('4','Hank Schrader','El Paso 17','1980-10-10','1003','VALID');
INSERT INTO certificate VALUES('5','Hank Schrader','El Paso 17','1980-01-10','1004','VALID');
INSERT INTO certificate VALUES('6','Walter White','Albuquerque 87107','1970-10-10','1005','VALID');
INSERT INTO certificate VALUES('7','Saul Goodman','El Paso 14','1973-10-10','1006','VALID');
INSERT INTO certificate VALUES('8','Gustavo Fring','Santa Fé 190','1964-10-11','1007','INVALID');
INSERT INTO certificate VALUES('9','Walter White','Albuquerque 87107','1978-01-08','1008','VALID');
INSERT INTO certificate VALUES('10','Hank Schrader','El Paso 17','1980-10-10','1009','VALID');
INSERT INTO certificate VALUES('11','Walter White','Albuquerque 87107','1978-01-08','1010','VALID');
INSERT INTO certificate VALUES('12','Hank Schrader','El Paso 98','1980-10-10','10011','VALID');
INSERT INTO certificate VALUES('13','Hank Schrader','El Paso 98','1980-10-10','10012','VALID');

查询:

具有有效证书的特殊代码条目数

select full_name, count(*) from certificate where validity = 'VALID' group by full_name;

所有持有有效证件的人

select * from certificate where validity = 'VALID' order by full_name;

有两个人同名,但他们住在不同的地址,所以我们可以假设这不是同一个人,第一次选择的结果是“不正确”

select * from certificate where validity = 'VALID' and full_name = 'Hank Schrader';

在这个选择中,有三个记录属于两个人的父亲和儿子。他们都住在同一个地址,但没有相同的出生日期第一次选择的结果太“不正确”

select * from certificate where validity = 'VALID' and full_name = 'Walter White';

所以我需要什么:

然后我可以添加记录。

最终,我需要一个具有有效证书且在表中有多个条目的所有唯一人员的列表(ID 为 11 的 Walter White 与 ID 为 8 的 Walter White 不代表同一个人)

所以结果将是:

full_name     | ids
----------------------
Walter White  | 1,6
Walter White  | 9,11
Hank Schrader | 4,5,10
Hank Schrader | 12,13

完整代码可在: http ://sqlfiddle.com/#!9/71c251/1

标签: mysql

解决方案


您可以在下面尝试 - 使用 group byfull_name,address,date_of_birth

演示

select full_name,
count(id) from certificate where validity = 'VALID'
group by full_name,address,date_of_birth having count(id)>1

推荐阅读