在MySQL中查询基于主键查找不同状态

时间:2015-10-29 03:00:53

标签: mysql sql database

我的问题是关于我想写的MySQL查询。我写了一些伪代码来帮助说明我想写的查询:

SELECT *
FROM persons AS p
INNER JOIN person_info AS pi 
ON p.person_id = pi.person_id
WHERE status MAY INCLUDE lost, missing, or found
WHAT person_id has no instances of the found status

我想知道每个person_id(可以有多个状态),这些状态没有“找到”状态的任何实例。我并不关心丢失和丢失的记录。我想找到基于每个独特的,不同的person_id没有“找到”状态的独特情况。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,可以选择使用li{ display: table-cell; background: red; height: 100%; position: relative; /* establish nearest positioned ancestor for abs. positioning */ width: 33.33%; /* new */ } img{ width: 100%; position: absolute; /* new */ bottom: 0; /* new */ }

not in

这将返回select * from persons where personid not in ( select personid from person_info where status = 'found' ) 表中persons表中与person_info不匹配的记录的所有记录。

或者,您可以使用status = 'found'left join/null check可以正常运行,Not exists可能会慢一些。 mysql检查也存在一些潜在问题。取决于那时的预期结果。

答案 1 :(得分:1)

据我所知@sgeddes。在写作中,我意识到它只是让人们眼前一亮。

SQL NOT IN()危险

create table mStatus
(   id int auto_increment primary key,
    status varchar(10) not null
);
insert mStatus (status) values ('single'),('married'),('divorced'),('widow');

create table people
(   id int auto_increment primary key,
    fullName varchar(100) not null,
    status varchar(10)  null
);

Chunk1:

truncate table people;
insert people (fullName,status) values ('John Henry','single');
select * from mstatus where status not in (select status from people);

** 3行,正如所料**

Chunk2:

truncate table people;
insert people (fullName,status) values ('John Henry','single'),('Kim Billings',null);
select * from mstatus where status not in (select status from people);

没有行,是吗?

显然这是不正确的'。它源于SQL使用三值逻辑, 由NULL的存在驱动,一个非值表示丢失(或UNKNOWN)信息。 使用NOT IN,Chunk2它的翻译如下:

status NOT IN ('married', 'divorced', 'widowed', NULL)

这相当于:

NOT(status='single' OR status='married' OR status='widowed' OR status=NULL)

表达式" status = NULL"评估为UNKNOWN,并根据三值逻辑的规则, NOT UNKNOWN也评估为UNKNOWN。因此,所有行都被过滤掉,查询返回一个空集。

可能的解决方案包括:

select s.status
from mstatus s
left join people p
on p.status=s.status
where p.status is null

或使用not exists