2016-02-26 11 views
0

Я делаю запрос, в котором я выбираю все из таблицы, называемой employee, и хочу сделать счет employee_id из двух других таблиц и представлять счет в двух отдельных столбцах.Выберите из одной таблицы с подсчетом из двух других таблиц

Таблицы:

  1. работника [ID, и т.д.]
  2. доклад [идентификатор, employee_id и т.д.]
  3. office_report [идентификатор, employee_id и т.д.]

Что я сделал до сих пор:

SELECT emp.*, COUNT(rep.id) no_of_field_reports, COUNT(of_rep.id) no_of_office_reports 
FROM employee emp 
LEFT JOIN report rep 
    ON (emp.id = rep.employee_id) 
LEFT JOIN office_report of_rep 
    ON (emp.id = of_rep.employee_id) 
WHERE emp.user_id =7 AND emp.active = 1 
GROUP BY emp.id, emp.name 
ORDER BY emp.name ASC 

Проблема заключается в том, что, как только у меня есть отчеты в таблицах отчетов BOTH, счет испортится. Скажем, у меня есть 16 докладов в таблицы отчетом и 2 в office_report таблицы, счетчик для no_of_field_reports и no_of_office_reports станет 32.

Im отсутствующего что-то очевидно, но я не SQL гения я не могу понять, что.

Пожалуйста, не забудьте объяснить, что является причиной проблемы, поэтому я могу учиться на своих ошибках и лучше разбираюсь в этих типах запросов, поскольку это не будет в последний раз.

Я думаю, ответ будет одинаковым для MariaDB, MySql и SQL в целом, так что я добавил все те бирки ради внимания ..

+0

несколько вариантов. используйте разные значения уникального идентификатора для каждой таблицы или подсчитывайте как встроенный вид. Причина в том, что количество ошибок испортится из-за мощности между таблицами, раздувает подсчеты. – xQbert

+0

@xQbert добавление DISTINCT в мой SELECT не работает. Думаю, я делаю это неправильно .. – DTH

ответ

1

Возможно, один подход, если вы после различных подсчетов (хотя вам может понадобиться, чтобы приспособиться к полю PK)

SELECT emp.*, 
     COUNT(distinct rep.id) no_of_field_reports, --may need to be on Unique key instead 
     COUNT(distinct of_rep.id) no_of_office_reports --may need to be on Unique key instead) 
FROM employee emp 
LEFT JOIN report rep 
    ON (emp.id = rep.employee_id) 
LEFT JOIN office_report of_rep 
    ON (emp.id = of_rep.employee_id) 
WHERE emp.user_id =7 AND emp.active = 1 
GROUP BY emp.id, emp.name 
ORDER BY emp.name ASC 

подхода с получением отсчетов до присоединяется, если вы не после отдельного подсчета, то это, вероятно, правильный подход и обеспечивает гибкость.

SELECT emp.*, rep.cnt, of_Rep.cnt 
FROM employee emp 
LEFT JOIN (SELECT count(ID) cnt , employee_ID 
      FROM REPORT 
      GROUP BY employee_ID) rep 
    ON (emp.id = rep.employee_id) 
LEFT JOIN (SELECT count(ID) cnt, Employee_ID  
      FROM office_report 
      GROUP BY employee_ID) of_rep 
    ON (emp.id = of_Rep.employee_id) 
WHERE emp.user_id =7 AND emp.active = 1 
GROUP BY emp.id, emp.name 
ORDER BY emp.name ASC 

или использование коррелированных запросов (но не поддерживается все время такой, как при создании материализованные представления этого SQL)

SELECT emp.*, 
     (SELECT count(ID) 
     FROM REPORT 
     WHERE emp.id = rep.employee_id) Report_Cnt, 
     (SELECT count(ID) 
     FROM office_report of_REP 
     WHERE emp.id = of_Rep.employee_id) of_Rep_Cnt 
FROM employee emp 
WHERE emp.user_id =7 AND emp.active = 1 
GROUP BY emp.id, emp.name 
ORDER BY emp.name ASC 
+0

Ницца .. но зачем мне настраивать ПК? – DTH

+0

Я не знал, были ли идентификаторы уникальными или PKs ... вот так я сказал, что МОЖЕТЕ подстраиваться. так как они ПК, вы должны быть в порядке. – xQbert

+0

Идентификатор отчета также уникален. Поэтому настройка не нужна? – DTH

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