MySQL LEFT JOIN Несколько условий - программирование
Подтвердить что ты не робот

MySQL LEFT JOIN Несколько условий

У меня есть две таблицы: A и B, связанные "group_id".

2 переменные, которые я использую: $keyword, $_SESSION['user_id']

A
group_id
ключевое слово

B
id
group_id
user_id

Я хочу иметь возможность выбирать все группы, в которых этот пользователь не находится, на основе поиска по ключевым словам.

Следовательно, цель состоит в том, чтобы ВЫБРАТЬ все строки в WHERE user_id!= {$ _ SESSION ['user_id'} для соответствующего group_id в B И как ключевое слово.

вот что я пробовал:

SELECT a.* 
FROM a 
LEFT JOIN b ON a.group_id=b.group_id 
WHERE a.keyword LIKE '%".$keyword."%' 
AND b.user_id!=$_SESSION{['user_id']} 
GROUP BY group_id

Однако он не находит никаких строк (совпадений), если я не удалю AND b.user_id!=$_SESSION{['user_id']}, и в этом случае он также будет содержать группы, в которых пользователь уже находится, - что не то, что я хочу.

Любая помощь будет оценена! Благодаря

4b9b3361

Ответ 1

Просто переместите дополнительное условие в критерии JOIN ON, таким образом, существование b не требуется для возврата результата

SELECT a.* FROM a 
    LEFT JOIN b ON a.group_id=b.group_id AND b.user_id!=$_SESSION{['user_id']} 
    WHERE a.keyword LIKE '%".$keyword."%' 
    GROUP BY group_id

Ответ 2

Правильный ответ:

SELECT a.group_id
FROM a 
LEFT JOIN b ON a.group_id=b.group_id  and b.user_id = 4
where b.user_id is null
  and a.keyword like '%keyword%'

Здесь мы проверяем user_id = 4 (ваш идентификатор пользователя из сеанса). Так как мы имеем это в критериях соединения, он будет возвращать нулевые значения для любой строки в таблице b, которая не соответствует критериям, т.е. Любая группа, в которой этот user_id НЕ находится.

Оттуда все, что нам нужно сделать, это фильтр для нулевых значений, и у нас есть все группы, в которых нет вашего пользователя.

демо здесь

Ответ 3

SELECT * FROM a WHERE a.group_id IN 
(SELECT group_id FROM b WHERE b.user_id!=$_SESSION{'[user_id']} AND b.group_id = a.group_id)
WHERE a.keyword LIKE '%".$keyword."%';