Mysql: не могу понять, что не так с этим запросом LEFT JOIN - PullRequest
0 голосов
/ 26 ноября 2018

Я хотел бы выполнить левое соединение с той же таблицей (лицензией), которое дает мне только лицензии, у которых нет записей в объединенной таблице.Но я не могу получить никакого результата: - (

Вот запрос (довольно простой на самом деле):

SELECT L1.licence_type, count(L1.id) as nb_licences FROM licence L1 
left JOIN licence L2 ON (L2.licence_number = L1.licence_number ) 
where L2.season = L1.season  and L2.league_id <> L1.league_id and L2.id IS NULL
GROUP BY L1.licence_type

Идея состоит в том, чтобы получить только те лицензии, которые изменились в лиге вв том же году (я специально пропустил условие года, чтобы упростить запрос).

Любая идея будет оценена.

Как подсказывает https://stackoverflow.com/users/236345/alfabravo,, вот моя структура:

CREATE TABLE IF NOT EXISTS `licence` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` int(10) UNSIGNED DEFAULT NULL,
  `association_id` int(10) UNSIGNED DEFAULT NULL,
  `league_id` int(10) UNSIGNED DEFAULT NULL,
  `season` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL,
  `date_creation` datetime NOT NULL,
  `licence_number` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `licence_type` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
  `active` tinyint(1) DEFAULT NULL,
  `date_validation` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
)

Что касается licence_type (чтобы задать https://stackoverflow.com/users/1144035/gordon-linoff),, то это просто тип, такой как "соревнование" или "тренировка" и т. Д. *

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Идея состоит в том, чтобы получить только лицензии, которые изменили лигу в том же году

Если вы хотите получить лицензии, которые изменили лигу за определенный год, я бы подумал "сгруппировать по":

select l.license_number, season
from license l
group by l.license_number, season
having min(league_id) <> max(league_id);

Мне неясно, что license_type имеет отношение к вашему вопросу.

0 голосов
/ 26 ноября 2018

Если вы используете левое соединение, вы не должны использовать столбцы левой объединенной таблицы в предложении where, таким образом, работать как внутреннее соединение, а затем добавлять в условие предложение ON

SELECT L1.licence_type, count(L1.id) as nb_licences 
FROM licence L1 
left JOIN licence L2 ON (L2.licence_number = L1.licence_number ) 
    AND L2.season = L1.season  
    and L2.league_id <> L1.league_id and L2.id IS NULL
GROUP BY L1.licence_type
...