2013-04-16 5 views
2

У меня есть 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

Вы можете удалить столбец 'job_id' из' t_person' и имеют новый столбец в '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

Я просто понял, что неправильно понял запрос, который я хотел от него;) То, что я хотел, больше похоже на (JOB NAME | КАК МНОГО ЛЮДЕЙ ИМЕЮТ ИХ), включая возможность иметь одну и ту же работу у одного человека (например, у Jon есть рабочие места: A, A, B, D -> count: 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; 
Смежные вопросы