2013-04-16 177 views
2

COUNT(*)我有2个表:MySQL的:从两个选择

t_job 
- id 
- name 

t_person: 
- id 
- name 
- job_id (fk t_job->id) 

t_other_jobs 
- person_id (fk t_person->id) 
- job_id (fk t_job->id) 

所以基本上我有谁拥有的主要工作和0或多个辅助工作的人。 我想要做的是创建查询,让我这样的事情:

PERSON NAME | ALL JOBS COUNT 

JOB NAME | HOW MANY PEOPLE HAVE THEM 

所以,如果一个人拥有的主要工作(它的一个外键,所以他必须有它)和另外2个工作。结果将是:

Jorge | 3 
+2

您可以从't_person'删除列'job_id'和有“t_other_jobs”中的新列作为标志来确定哪一个是主要的; IsMain作为布尔值。 –

回答

0

尝试

1日查询(PERSON NAME | ALL JOBS COUNT

SELECT name PersonName, maincount + Count(o.Job_Id) AS AllJobsCount 
FROM (
    SELECT p.Id, p.name, COUNT(m.Id) AS MainCount 
    FROM t_person p 
    LEFT JOIN t_job m ON p.job_id = m.Id 
    GROUP BY P.Id 
) a 
Left Join t_other_jobs o ON A.Id = o.person_id 
GROUP BY a.Id 

第二查询(JOB NAME | HOW MANY PEOPLE HAVE THEM

SELECT j.Name JobName, 
     (SELECT COUNT(1) FROM t_person WHERE job_id=j.Id) + 
     (SELECT COUNT(1) FROM t_other_jobs WHERE job_id=j.Id) AS Count 
FROM t_job j 
2

既然你说他们将永远有一份工作,你可以指望他们的其他工作,并添加1:

SELECT 
    p.id, 
    p.name, 
    count(o.job_id)+1 as Jobs 
FROM 
    t_person p 
LEFT JOIN 
    t_other_jobs o 
ON 
    p.id=o.person_id 
GROUP BY 
    p.id, p.name; 
+0

我刚刚发现我错误地输入了我想要的查询;)我想要的更像是(工作职位名称|有多少人拥有这些职位),包括可能在一个人身上有同样的工作(例如:乔恩有工作: A,B,D - >计数:4) – gemGreg

+0

@gemGreg:请考虑问这是一个新问题,因为有几个人已经投入时间为您的原始问题提供解决方案(这对于某人来说可能仍然有用,办法)。 –

+0

我添加了第二个查询。正在考虑添加新的问题,但似乎所有的答案都在这里很好地回答;)感谢大家的帮助。你很聪明 – gemGreg

0

这qwery会给你第一个结果。

select 
    person.id, 
    count(distinct (person.job_id)) + count(other_jobs.job_id) as All_job 
from 
    person 
     Inner JOin 
    other_jobs 
where 
    person.id = other_job.person_id 
group by person.id 

这会给你第二个。

select 
    job.name, count(distinct (person.id)) as no_of_people 
from 
    person 
     INNER JOIN 
    job ON person.job_id = job.id 
group by job_id 
UNION select 
    job.name, count(distinct (person_id)) as no_of_people 
from 
    other_job 
     INNER join 
    job ON job.id = other_job.job_id 
group by job_id;