mySQL как оставить присоединиться - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь получить данные из моей базы данных SQL, но у меня есть проблема, которую я не понимаю. Это мой запрос:

SELECT SUM(t0_.in_budget_hours) AS sclr_0, 
SUM(t0_.billable_amount) AS sclr_1, 
SUM(t0_.out_budget_hours) AS sclr_2, 
SUM(t0_.unprod_hours) AS sclr_3, 
SUM(t0_.off_hours) AS sclr_4,
SUM(t0_.duration) AS sclr_5, 
SUM(t0_.in_budget_hours) / SUM(t0_.duration) * 100 AS sclr_6, 
CONCAT(c1_.name, ' ', c1_.lastname) AS sclr_7, 
c1_.alias AS alias_8, 
c1_.email AS email_9 
FROM collaborator c1_
RIGHT JOIN timesheet t0_ ON (c1_.email = t0_.email) 
WHERE t0_.entry_date BETWEEN '2020-01-01 00:00:00' AND '2020-01-22 23:59:59' 
GROUP BY sclr_7, c1_.alias, c1_.email 
ORDER BY sclr_7 ASC

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

Я бы хотел, чтобы все соавторы и объедините их с расписаниями, даже если у них нет расписаний (СЛЕВАЮЩЕЕ СОЕДИНЕНИЕ). Если строки, связанной с соавтором, нет, результат суммирования должен быть равен 0, но соавтор должен появиться в наборе данных результатов. Но в настоящее время, если у соавтора нет расписания BETWEEN '2020-01-01 00:00:00' AND '2020-01-22 23:59:59', он не будет отображаться в результатах.

Я пробовал несколько типов объединения с помощью этой темы В чем разница между INNER JOIN, LEFT JOIN, RIGHT ПРИСОЕДИНЯЙТЕСЬ И ПОЛНОСТЬЮ ПРИСОЕДИНИТЬСЯ? но у меня ничего не получалось Может кто-нибудь сказать мне, как иметь всех соавторов, даже если нет расписания?

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Я хотел бы иметь всех соавторов и присоединиться к ним с расписаниями, даже если у них нет расписаний (LEFT JOIN).

Ваш RIGHT JOIN, кажется, делает противоположное этому. Как таковой, он будет принимать все строки в entry_date, даже те, которые не соответствуют записи в collaborator. RIGHT JOIN s довольно нелогичны для людей, привыкших читать слева направо.

Я бы переписал ваш JOIN следующим LEFT JOIN:

FROM collaborator c1_
LEFT JOIN timesheet t0_ 
    ON c1_.email = t0_.email
    AND t0_.entry_date >= '2020-01-01'
    AND t0_.entry_date < '2020-01-23' 

Примечания:

  • условия на timesheet необходимо перенести из условия WHERE в ON часть JOIN

  • Я переписал фильтр даты, чтобы использовать полуоткрытые интервалы, которые мне удобнее читать и понимать

0 голосов
/ 22 января 2020

Вам нужно объединить OUTER, чтобы объединить две таблицы, где может не быть совпадающими строками в одной из двух таблиц.

По умолчанию объединениями являются INNER, то есть возвращаются только строки, в которых есть совпадение.

Мне кажется, что LEFT OUTER должно дать вам то, что вы хотите.

select * from a LEFT OUTER JOIN b означает все строки из a и соответствующие строки (или NULL с) из b

Подробнее здесь

...