2009-08-03 7 views
1

Ich versuche, einen Join zu erstellen, aber ich kann es nicht in MySQL arbeiten, ich weiß, dass es einen Weg geben muss.MySQL Join mit Ausnahme bestimmter Datensätze?

Ich habe zwei Tabellen: 1. Setting und 2. User_Setting (und natürlich User aber das wird hier nicht benötigt werden).

Struktur

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

User_Setting.user_id 
User_Setting.setting_id 
User_Setting.value 

Ich möchte alle Setting Datensätze auszuwählen, und User_Setting zu verbinden, in dem ein Wert vorhanden ist. Klassische äußere Verbindung würde ich glauben?

Ich habe diese Anfrage:

 
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; 

Aber das funktioniert nicht, wenn ein User mit user_id 2 einen User_Setting Datensatz vorhanden für ein bestimmtes setting_id hat, aber die User mit user_id 1 hat nicht nur, dass setting_id gespeicherte Aufzeichnung ...

Hat eine Abfrage jemand, wo alle Einstellungen abgerufen werden, mit user_id und value NULL, wenn die User_Setting Datensatz existiert nicht?

Antwort

2

Diese (wenn Sie überprüfen möchten, dass der Benutzer vorhanden ist)

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 

oder diese (wenn Sie nicht wollen, prüfen Sie, ob der Benutzer vorhanden ist): I in der Regel

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

toll das funktioniert perfekt. Vielen Dank! – Ropstah

0

Fügen Sie der WHERE-Klausel eine Bedingung hinzu, um zu überprüfen, ob das primäre if-Objekt in der zu verknüpfenden Tabelle nicht null ist.