2010-06-15 4 views
0

Ceci est ma requête en cours - il n'obtient pas le résultat requis. Je veux qu'il affiche toutes les «ressources» même si elles n'ont pas de connexion. Lorsque j'essaie la jointure gauche ou la jointure droite, elle renvoie toujours le même résultat. Le résultat que je reçois est:Rejoindre 3 tables - faire se joint à comment

id | role | resource | name 

5 | 4  |  2 | Changelog 

Je veux

id | role | resource | name 

5 | 4 | 2 | Changelog 
null | null | null | Resource2 
null | null | null | Resource3 

Est-ce possible?

Répondre

3

En regardant à travers votre requête, role fait partie de user_permissions qui est l'une des connexions qui peuvent exister ou non. Pensez à changer votre clause where WHERE `role`= '4' OR `role` IS NULL si vous souhaitez afficher ces enregistrements nuls et ...

En outre, bien que cela peut être accompli par un droit rejoindre, je crois qu'il est plus lisible/compréhensible si vous sélectionnez de user_resources à la place, puis gauche rejoindre sur les autres tables. Cela résulte de votre déclaration de description de problème; vous voulez "afficher toutes les 'ressources' même si elles n'ont pas de connexion", ce qui signifie que vous voulez sélectionner parmi les ressources, puis rejoindre toutes les connexions si elles existent.

2

dans votre sql te demande

WHERE `role` = '4' 

et veulent un résultat qui a null dans role? null n'est pas 4, donc il n'y a pas un tel résultat.

1

D'abord: votre clause where limitera toujours l'ensemble de résultats. Vous avez une condition qui exige que le rôle soit "4" - donc il n'affiche aucun résultat à moins que le résultat ait "4" dans la colonne de rôle. D'où vient "name" - puisque c'est celui que vous voulez voir apparaître, vous devez avoir la table avec cette colonne comme table de base et LEFT JOIN pour les deux autres tables.

En supposant "nom" provient de ressources, votre requête doit lire:

SELECT * 
FROM `user_resources` 
LEFT JOIN `user_permissions` ON `user_permissions`.`resource` = `user_resources`.`id` 
LEFT JOIN `user_groups` ON `user_groups`.`id` = `user_permissions`.`role` 
1

SELECT * DE (user_permissions) INSCRIPTION SUR user_groupsuser_groups. id = user_permissions. role JOIN user_resources ON user_resources. id = user_permissions. resource Où (role = '4' ou role est null)

vous allez obtenir le résultat de cette requête