Почему условие WHERE отбрасывает контент, полученный LEFT JOIN? SQLITE - PullRequest
0 голосов
/ 07 апреля 2020

Пример 3 связанных таблиц: enter image description here

  • Пользователь 2 (март ie) не зарегистрирован в таблице "связей". Поэтому позже при использовании SELECT его значение отношения должно быть нулевым / пустым.

Я делаю следующий SELECT, который получает все связанные данные, которые меня интересуют (правильно):

SELECT id, action, actions.uid, name, relation
FROM actions
LEFT JOIN (SELECT * FROM relations GROUP BY uid) USING (uid)
INNER JOIN users USING (uid)
GROUP BY actions.id;

И вернуть: enter image description here

Проблема возникает, когда мне нужно использовать условия для «отбрасывания» результатов на основе типа отношения.

Я делаю следующий запрос, чтобы отбросить "друга" (отношение) из предыдущих результатов:

SELECT id, action, actions.uid, name, relation
FROM actions
LEFT JOIN (SELECT * FROM relations GROUP BY uid) USING (uid)
INNER JOIN users USING (uid)
WHERE relation != 'friend'
GROUP BY actions.id;

Однако он должен вернуть один результат (март ie), и он возвращает 0 результатов .. .

Меня не интересует получение Mar ie в результате условия типа, такого как "... WHERE отношение равно NULL", мои запросы должны работать отбрасыванием, поскольку они принадлежат фильтрующий инструмент.

enter image description here

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Попробуйте использовать coalesce (Relation, '')! = 'Friend'. Надеюсь, это сработает

0 голосов
/ 07 апреля 2020

Необходимо выполнить фильтрацию с помощью предложения on:

SELECT id, action, actions.uid, name, relation
FROM actions LEFT JOIN 
     relations 
     USING (uid) AND relation != 'friend' LEFT JOIN -- Don't mix the left & inner join
     users USING (uid); 

LEFT JOIN с предложением WHERE превратится в INNER JOIN, а сравнение с null всегда будет ложным. Таким образом, отфильтрованный отдельно, оставляя присоединение.

Однако, я бы повторно express это как:

SELECT a.id, a.action, a.uid, u.name, r.relation
FROM actions a INNER JOIN
     users u
     USING (uid) LEFT JOIN
     relation r
     USING (uid) AND r.relation != 'friend';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...