Получете общ брой записи с mysql съединение и 2 таблици

Имам 2 маси, към които се опитвам да се присъединя, но не съм сигурен как да го направя максимално ефективно.

Таблица със задачи:

nid | created_by | claimed_by | urgent
1   |     11     |     22     |   1
2   |     22     |     33     |   1
3   |     33     |     11     |   1
1   |     11     |     43     |   0
1   |     11     |     44     |   1

Таблица на служителите:

userid | name
  11   |  EmployeeA
  22   |  EmployeeB
  33   |  EmployeeC

Резултат, който се опитвам да получа:

userid | created_count | claimed_count | urgent_count
  11   |       3       |       1       |       3
  22   |       1       |       1       |       2
  33   |       1       |       1       |       2

Колоната created_account ще покаже общо # задачи, създадени от този потребител.

Колоната claimed_count ще покаже общо # задачи, заявени от този потребител.

Колоната urgent_count ще покаже общо # спешни задачи (създадени или заявени) от този потребител.

Благодаря предварително!


person 626    schedule 23.07.2015    source източник
comment
Просто напишете заявката и я тествайте. След това, когато се окаже твърде бавен, опитайте да го оптимизирате. Ако не успеете, можете да публикувате своя опит, заедно със структурата на таблицата, индексите, количествата данни и друга подходяща информация, която може да ни помогне да намерим пречка във вашата заявка. В момента този въпрос е непълен.   -  person GolezTrol    schedule 23.07.2015


Отговори (1)


Бих започнал, като разделя това на парчета и след това ги сглобявам отново. Можете да получите created_count и claimed_count, като използвате просто агрегиране като това:

SELECT created_by, COUNT(*) AS created_count
FROM myTable
GROUP BY created_by;

SELECT claimed_by, COUNT(*) AS claimed_count
FROM myTable
GROUP BY claimed_by;

За да получа спешния брой за всеки служител, бих съединил двете таблици при условие, че служителят е или колоната created_by, или claimed_by, и групата по служител. Вместо да броим обаче, бих използвал SUM(). Правя това, защото изглежда, че всеки ред ще бъде 0 или 1, така че SUM() ефективно ще преброи всички ненулеви редове:

SELECT e.userid, SUM(t.urgent)
FROM employee e
JOIN task t ON e.userid IN (t.created_by, t.claimed_by)
GROUP BY e.userid;

Сега, когато имате всички битове данни, от които се нуждаете, можете да използвате външно съединение, за да свържете всички тези подзаявки към таблицата на служителите, за да получите техния брой. Можете да използвате функцията COALESCE(), за да замените всички нулеви стойности с 0:

SELECT e.userid, COALESCE(u.urgent_count, 0) AS urgent_count, COALESCE(crt.created_count, 0) AS created_count, COALESCE(clm.claimed_count, 0) AS claimed_count
FROM employee e
LEFT JOIN(
  SELECT e.userid, SUM(t.urgent) AS urgent_count
  FROM employee e
  JOIN task t ON e.userid IN (t.created_by, t.claimed_by)
  GROUP BY e.userid) u ON u.userid = e.userid
LEFT JOIN(
  SELECT claimed_by, COUNT(*) AS claimed_count
  FROM task
  GROUP BY claimed_by) clm ON clm.claimed_by = e.userid
LEFT JOIN(
  SELECT created_by, COUNT(*) AS created_count
  FROM task
  GROUP BY created_by) crt ON crt.created_by = e.userid;

Ето пример за SQL Fiddle.

person AdamMc331    schedule 23.07.2015