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);