2012-04-13 4 views
1

У меня есть 3 таблицы в моей базе данных:MySQL - Как вернуть несколько результатов для каждого набора GROUP BY?

  1. employee_log
  2. job_log
  3. crew_log

Когда новое задание создается, сотрудник назначается ему, и поэтому запись является сделанные в таблице «crew_log».

То, что я пытаюсь сделать, - это получить каждого сотрудника с атрибутом type = 2 (что означает, что они являются супервизором) (from employee_log), а затем присоединиться к запросу crew_log.

Каждый сотрудник может иметь несколько активных заданий в «crew_log», поэтому цель состоит в том, чтобы вернуть ВСЕ активные задания для этого сотрудника в массиве.

Мой запрос до сих пор выглядит следующим образом:

SELECT el.id, cl.job_id 
FROM employee_log AS el 
JOIN crew_log AS cl 
    ON el.id=cl.employee_id 
    AND cl.start_date >= CURDATE() 
WHERE el.type=2 
GROUP BY cl.employee_id 

Это, конечно, не правильный, но, возможно, это поможет визуализировать мой вопрос.

Я могу, конечно, сделать это по-другому ... Но я пытаюсь сделать все это один SQL запрос как для производительности и узнать что-то новое о SQL :)

Альтернатива для меня, чтобы использовать два в то время как циклы. Первый цикл получит каждого сотрудника с типом = 2, а затем в этом цикле я сделаю еще один SQL-запрос, чтобы получить все активные задания для этого сотрудника.

Должен быть лучший способ сделать это?

+0

Пожалуйста, добавьте структуры трех таблиц к вашему вопросу. – nnichols

+0

Я сам не получаю эти требования. Вероятно, добавив некоторые примеры данных из ваших таблиц (я думаю, 'job_log' будет ненужным), и ваш ожидаемый результат в табличном формате поможет. –

ответ

1

Ваш запрос выглядит правильно, как это, за исключением того, что вам не нужно GROUP BY, так как вы не имеете никаких агрегатных функций (SUM(), COUNT(), AVG()) Заменить его с ORDER BY сортировать по идентификатору сотрудника.

SELECT el.id, cl.job_id 
FROM 
    employee_log AS el 
    LEFT JOIN crew_log AS cl 
    ON el.id=cl.employee_id 
WHERE 
    el.type=2 
    AND cl.start_date >= CURDATE() 
ORDER BY el.id 

Я также заменить ваш JOIN с LEFT JOIN так, что сотрудники, которые не имеют записей в crew_log не исключены из запроса.

Смежные вопросы