SQL Left присоединяется к таблице на левой объединенной таблице - PullRequest
1 голос
/ 19 мая 2019

В настоящее время я пытаюсь присоединиться к левой таблице таблицы слева, как показано ниже.У меня есть таблицы:

  • учетные записи (id, vorname, nachname)
  • projektkurse (id, account_id, projektwochen_id)
  • projektkurs_einzel (id, projektkurse_id)
  • projektkurs_einzel_zeiten (идентификатор, дата, смещение, projektkurs_einzel_id)

Теперь я хочу получить каждую учетную запись и количество раз, когда они имеют запись в projektkurs_einzel_zeiten, которая также должна быть уникальной.Таким образом, наличие одной и той же даты и смены несколько раз не считается несколькими записями.Результат также должен быть ограничен столбцом projektwochen_id из таблицы projektkurse.Этот столбец должен соответствовать определенному значению, например, 8. 8. 1013 *

Некоторые учетные записи не имеют записей в projektkurse, projektkurs_einzel и projektkurs_einzel_zeiten, вот почему моя первая мысль заключалась в использовании LEFT JOIN, например:

SELECT accounts.id, accounts.vorname, accounts.nachname, COUNT(DISTINCT projektkurs_einzel_zeiten.date, projektkurs_einzel_zeiten.shift) AS T
FROM accounts
LEFT JOIN projektkurse on accounts.id = projektkurse.creator_id
LEFT JOIN projektkurs_einzel on projektkurse.id = projektkurs_einzel.projektkurs_id
LEFT JOIN projektkurs_einzel_zeiten ON projektkurs_einzel.id = projektkurs_einzel_zeiten.projektkurs_einzel_id
WHERE projektkurse.projektwochen_id = 8
GROUP BY accounts.id

Этот запрос не дает именно то, что я хочу.Он возвращает только те учетные записи, которые имеют как минимум одну запись в projektkurs, даже если их нет в projektkurs_einzel и projektkurs_einzel_zeiten.Количество для них очевидно равно 0, но учетные записи, в которых нет записей в projektkurse, полностью игнорируются.Как я могу также показать учетные записи, которые не имеют записей в любой другой таблице с счетом 0, а?

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Я бы порекомендовал написать запрос так:

SELECT a.id, a.vorname, a.nachname,
       COUNT(DISTINCT pez.date, pez.shift) AS T
FROM accounts a LEFT JOIN
     projektkurse 
     ON a.id = pk.creator_id AND
        pk.projektwochen_id = 8 LEFT JOIN
     projektkurs_einzel pe
     ON pk.id = pe.projektkurs_id LEFT JOIN
     projektkurs_einzel_zeiten pez
     ON pe.id = pez.projektkurs_einzel_id
GROUP BY a.id, a.vorname, a.nachname;

Примечания:

  • Ваша проблема устранена путем перемещения условия WHERE в предложение ON. Ваш WHERE превращает внешнее объединение во внутреннее, потому что значения NULL не совпадают.
  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • Рекомендуется включать все неагрегированные столбцы в GROUP BY. Однако, предполагая, что id уникален, ваша формулировка в порядке (из-за того, что называется «функциональными зависимостями»).
0 голосов
/ 19 мая 2019

Вы не должны использовать столбцы таблицы eft join, где это условие работает как внутреннее соединение

Вы должны переместить условие where для левой объединенной таблицы в соответствующее предложение ON

SELECT accounts.id, accounts.vorname, accounts.nachname, COUNT(DISTINCT projektkurs_einzel_zeiten.date, projektkurs_einzel_zeiten.shift) AS T
FROM accounts
LEFT JOIN projektkurse on accounts.id = projektkurse.creator_id 
                          AND projektkurse.projektwochen_id = 8
LEFT JOIN projektkurs_einzel on projektkurse.id = projektkurs_einzel.projektkurs_id
LEFT JOIN projektkurs_einzel_zeiten ON projektkurs_einzel.id = projektkurs_einzel_zeiten.projektkurs_einzel_id
GROUP BY accounts.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...