2009-08-03 9 views
1

J'essaye de construire une jointure, mais je ne peux pas l'obtenir pour fonctionner dans MySQL, je sais qu'il doit y avoir un moyen.MySQL Join exclusion de certains enregistrements?

J'ai deux tables: 1. Setting et 2. User_Setting (et ofcourse User mais ce ne sera pas nécessaire ici).

Structure

 
Setting.setting_id 
Setting.description 
Setting.value_type 
Setting.default_value 

User_Setting.user_id 
User_Setting.setting_id 
User_Setting.value 

Je veux sélectionner tous les dossiers Setting et rejoindre User_Setting où il y a une valeur. Jointure externe classique je crois?

J'ai cette requête:

 
SELECT 
`User_Setting`.`user_id`, 
`User_Setting`.`value`, 
`Setting`.`setting_id`, 
`Setting`.`default_value`, 
`Setting`.`value_type`, 
FROM 
`User_Setting` 
Right Join `Setting` ON `User_Setting`.`setting_id` = `Setting`.`setting_id` 
WHERE 
`User_Setting`.`user_id` IS NULL OR 
`User_Setting`.`user_id` = 1; 

Mais cela ne fonctionne pas si un User avec user_id 2 a un cadeau record User_Setting pour un certain setting_id, mais le User avec user_id 1 n'a pas obtenu que setting_id enregistrement stocké ...

Est-ce que quelqu'un a une requête où TOUS les paramètres seront récupérés, avec user_id et value NULL si leL'enregistrementn'existe pas?

Répondre

2

Ce (si vous voulez vérifier que l'utilisateur existe)

SELECT `User_Setting`.`user_id`, 
     `User_Setting`.`value`, 
     `Setting`.`setting_id`, 
     `Setting`.`default_value`, 
     `Setting`.`value_type`, 
FROM user 
CROSS JOIN 
     setting 
LEFT JOIN 
     user_setting 
ON  user_setting.user_id = user_id 
     AND user_setting.setting_id = setting.setting_id 
WHERE user_id = 1 

ou ce (si vous ne voulez pas vérifier que l'utilisateur existe):

SELECT `User_Setting`.`user_id`, 
     `User_Setting`.`value`, 
     `Setting`.`setting_id`, 
     `Setting`.`default_value`, 
     `Setting`.`value_type`, 
FROM setting 
LEFT JOIN 
     user_setting 
ON  user_setting.user_id = 1 
     AND user_setting.setting_id = setting.setting_id 
+0

génial cela fonctionne parfaitement. Merci! – Ropstah

0

Je habituellement ajouter une condition à la clause WHERE pour vérifier que le primaire si dans la table jointe n'est pas null.

Questions connexes