我的问题是关于我想写的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没有“找到”状态的独特情况。
答案 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