web-dev-qa-db-fra.com

MySQL LEFT JOIN Conditions multiples

J'ai deux tables: A et B liées par "group_id".
2 variables que j'utilise: $keyword, $_SESSION['user_id']

A
group_id
mot-clé

B
id
group_id
identifiant d'utilisateur

Je veux pouvoir sélectionner tous les groupes dans lesquels cet utilisateur n'est pas basé sur une recherche par mot clé.

Par conséquent, le but est de SÉLECTIONNER toutes les lignes de A OERE l'ID utilisateur! = {$ _ SESSION ['ID_utilisateur'} pour l'ID groupe correspondant en B ET comme le mot-clé.

c'est ce que j'ai essayé:

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

Cependant, il ne trouve aucune ligne (correspondance) sauf si je supprime AND b.user_id!=$_SESSION{['user_id']} auquel cas il inclura également des groupes dans lesquels l'utilisateur est déjà - ce qui n'est pas ce que je veux.

Toute aide serait appréciée! Merci

25
Jon Robinson

Il suffit de déplacer la condition supplémentaire dans les critères JOIN ON, de cette façon, l'existence de b n'est pas requise pour renvoyer un résultat

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
39
Bryan

La bonne réponse est simplement:

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%'

Ici, nous vérifions user_id = 4 (votre identifiant utilisateur de la session). Puisque nous l'avons dans les critères de jointure, il renverra des valeurs nulles pour toute ligne du tableau b qui ne correspond pas aux critères - c'est-à-dire, tout groupe dans lequel cet ID utilisateur n'est PAS.

À partir de là, tout ce que nous devons faire est de filtrer les valeurs nulles et nous avons tous les groupes dans lesquels votre utilisateur ne se trouve pas.

démonstration ici

12
pala_