2016-10-19 7 views
0

ich die folgenden Tabellen in meiner Datenbank haben:MySql-Abfrage beitreten Tabellen

Gerichte

id 
name 

Benutzer

id 
email 

Zutaten

dishes_ingredients (dies wird verwendet, um die Beziehung zwischen Geschirr und Zutaten zu repräsentieren)

id 
dish_id 
ingredient_id 

users_allergic_ingredients (Benutzer bestimmte Inhaltsstoffe allergisch sind)

id 
user_id 
ingredient_id 

ein bestimmter Benutzer gegeben (user_id), ich muss alle Gerichte bekommen, auf die der Benutzer NICHT allergisch ist.

Ich habe versucht, mit dieser Abfrage:

SELECT * 
FROM dishes 
JOIN dishes_ingredients 
ON dishes.id = dishes_ingredients.dish_id 
WHERE dishes_ingredients.ingredient_id NOT IN 
     (SELECT uai.ingredient_id FROM users_allergic_ingredients uai WHERE uai.user_id = 1) 

Aber ich bekomme alle Gerichte und nicht nur die Gerichte, auf die der Kunde nicht allergisch ist.

Was mache ich falsch?

Antwort

1

Sie erhalten Zutaten, die abwesend sind, nicht Geschirr.

würde ich dies mit Aggregationsansatz:

SELECT di.dish_id 
FROM dishes_ingredients di LEFT JOIN 
    users_allergic_ingredients uai 
    ON uai.ingredient_id = di.ingredient_id AND 
     uai.user_id = 1 
GROUP BY di.dish_id 
HAVING COUNT(uai.integredient_id) = 0; 

Die FROM Klausel uai übereinstimmt, wenn der Benutzer auf die Komponente allergisch ist. Die HAVING-Klausel bestimmt nur, dass die Anzahl Null ist.

+0

ausgelassen wurden Was passiert, wenn ich die Abfrage ändern möchten, und von Gerichten statt dishes_ingredients starten? – Giorgio

0

Es klingt verdrahtet, aber Sie können linken Join zu users_allergic_ingredients verwenden und nur die Zeilen erhalten, zu denen der Join nicht erfolgreich war. so -

SELECT D.name 
FROM dishes D 
INNER JOIN dishes_ingredients DI 
ON D.id = DI.dish_id 
LEFT OUTER JOIN users_allergic_ingredients UAI 
ON UAI.user_id = @user_id 
and UAI.ingridient_id = DI.ingridient_id 
WHERE UAI.ingridient_id IS NULL 

Bekanntmachung der WHERE, die die Zeilen absichtlich fragt die