Mysql 统计有工作或正在上课的囚犯人数
各表如下:Mysql 统计有工作或正在上课的囚犯人数,mysql,Mysql,各表如下: Person person_ssn first_name middle_name last_name Prisoner prisoner_id person_ssn Work prisoner_id job_id Class prisoner_id class_id 我很想知道有工作或上课的囚犯人数。任何提示都将不胜感激 到目前为止我所拥有的 select count(prisoner.prisoner_id) FROM prisoner INNER JOIN work o
Person
person_ssn
first_name
middle_name
last_name
Prisoner
prisoner_id
person_ssn
Work
prisoner_id
job_id
Class
prisoner_id
class_id
我很想知道有工作或上课的囚犯人数。任何提示都将不胜感激
到目前为止我所拥有的
select count(prisoner.prisoner_id)
FROM prisoner
INNER JOIN work on prisoner.prisoner_id = work.prisoner_id
INNER JOIN school on prisoner.prisoner_id = school.prisoner_id;
这似乎是在返回既有工作又在上学的囚犯的计数。您在第一个内部联接结果中使用了第二个内部联接-这意味着您检查囚犯和工作囚犯的交叉点,然后检查工作囚犯和上课的囚犯的交叉点 试试这个:
select count(*) from (
(select * from
prisoner inner join work on prisoner.prisoner_id = work.prisoner_id) as first
union
(select * from
prisoner inner join class on prisoner.prisoner_id = class.prisoner_id) as second);
使用左联接,但要求至少有一个联接成功,方法是检查联接表中的列是否为null(缺少的左联接在联接表中的列中都为null):
请注意,我在计数中添加了
distinct
,以防囚犯有多份工作或参加多个课程,否则会对囚犯进行多次计数。我认为处理此查询的最有效方法是使用exists
:
select count(*)
from prisoners p
where exists (select 1 from work w where w.prisoner_id = p.prisoner_id) or
exists (select 1 from class c where c.prisoner_id = p.prisoner_id);
这对
工作(囚犯id)
和类(囚犯id)
上的索引最有效我收到一个错误代码:1248。每个派生表在您的实现中都必须有自己的别名。请尝试将别名添加到每个内部查询。我必须将“unique”更改为“distinct”,但这是可行的。干杯啊!我是说不同的。。。咖啡还没有开始供应:)
select count(*)
from prisoners p
where exists (select 1 from work w where w.prisoner_id = p.prisoner_id) or
exists (select 1 from class c where c.prisoner_id = p.prisoner_id);