2017-11-17 2 views
0

Ich weiß, es gibt viele "ähnliche" Fragen, aber ich kann nicht herausfinden, wie dies funktioniert. Ich hoffe, es ist ganz einfach für jemand anderen!MySQL Beitreten Szenario

Ich habe eine Abfrage, die wie folgt aussieht:

SELECT 
    d.name DishName, 
    alt.name AllergyName 
FROM meals_dish d 
JOIN meals_dishingredient di ON di.dish_id = d.id 
LEFT JOIN meals_food_allergytypes fat ON fat.food_id = di.food_id 
LEFT JOIN meals_allergytypes alt ON alt.id = fat.allergytypes_id 
GROUP BY d.id, alt.id 
ORDER BY d.name 

, die mich Tabelle ähnlich der folgenden schenkt:

Dish Name    | AllergyName 
----------------------------------------- 
Almond Pudding   |  NULL 
Almond Pudding   |  Egg 
Apple Cake    |  Milk 
Apple Cake    |  Lactose 
Apple Cake    |  Egg 
Apple Cake    |  NULL 
Avocado Chocolate Cream |  Milk 
Avocado Chocolate Cream |  Lactose 
Avocado Chocolate Cream |  NULL 
Avocado Chocolate Cream |  Peanuts 
Avocado Chocolate Cream |  Tree Nuts 
Avocado Chocolate Cream |  Soy 
Avocado Egg    |  NULL 
Avocado Egg    |  Egg 
Bacon Wrapped Asparagus |  NULL 
Baked Cauliflower  |  NULL 
Baked Cauliflower  |  Milk 
Baked Cauliflower  |  Lactose 
Baked Salmon   |  NULL 
Baked Salmon   |  Milk 
Baked Salmon   |  Lactose 

Nun, was würde ich tun, ist zu machen eine Liste aller Gerichte, bei denen einer der Allergie-Namen für ein bestimmtes Gericht nicht "Egg" oder etc. ist.

Zum Beispiel, wenn ich nur Geschirr bekommen wollte, dass jemand, der Egg nicht essen konnte, dann wäre ich Lauf Diese Abfrage und sollte die Gerichte von Avocado Chocolate Cream, Bacon Wrapped Asparagus, Baked Cauliflower and Baked Salmon zurück.

Ich habe versucht, einige WHERE NOT IN und andere ähnliche einzurichten, aber ich weiterhin nur eine bestimmte Zutat aus dem Gericht zu entfernen, anstatt nur die Schüssel nicht zu wählen. Zum Beispiel würde Apple Cake bei meinen Suchanfragen mit dem Beispiel "Egg" einfach noch zurückkehren, aber die spezifische Zeile von "Egg" würde jetzt nicht angezeigt.

+1

Warum verwenden Sie 'GROUP BY' ohne Aggregatfunktionen? – kchason

Antwort

2

Zuerst darüber nachdenken, wie zu bestimmen, welche Gerichte "Egg" in ihnen.

SELECT 
    FoodAllergyTbl.dish_id 
FROM 
    `meals_food_allergytypes` AS FoodAllergyTbl 
INNER JOIN 
    `meals_allergytypes` AS AllergyTbl 
    ON FoodAllergyTbl.allergy_types_id = AllergyTbl.id 
WHERE 
    AllergyTbl.name = 'Egg'; 

Dann können Sie die Liste der Gerichte auszuwählen, in dem die id nicht in der obigen Liste ist.

SELECT 
    name 
FROM 
    `meal_dish` 
WHERE 
    `id` NOT IN (
    SELECT 
     FoodAllergyTbl.dish_id 
    FROM 
     `meals_food_allergytypes` AS FoodAllergyTbl 
    INNER JOIN 
     `meals_allergytypes` AS AllergyTbl 
     ON FoodAllergyTbl.allergy_types_id = AllergyTbl.id 
    WHERE 
     AllergyTbl.name = 'Egg' 
); 
+0

Ich habe meine Tabelle Struktur in der Frage nicht vollständig zur Verfügung gestellt, um zu versuchen, die Hauptidee im Fokus zu halten. Aber ich denke, Ihre Logik macht Sinn, und ich arbeite daran, die Abfragen etwas zu überarbeiten. Ich lasse es dich wissen! –

+1

Ok ... nun, ich habe wirklich versucht, so etwas in Gang zu bringen, bevor ich diese Frage gepostet habe, aber ich habe es nicht verstanden. Nichtsdestotrotz ... Ich konnte es nur ein wenig zu meiner Information überarbeiten, die ich Ihnen nicht zur Verfügung gestellt habe, und es war gut. Vielen Dank! –

0

Sie könnten auf diese Weise für Dish-Name zB für Egg NOT:

select name 
    from meals_dish 
    where name not in (
    SELECT distinct d.name  
    FROM meals_dish d 
    JOIN meals_dishingredient di ON di.dish_id = d.id 
    LEFT JOIN meals_food_allergytypes fat ON fat.food_id = di.food_id 
    LEFT JOIN meals_allergytypes alt ON alt.id = fat.allergytypes_id 
      AND alt .AllergyName = 'Egg' 
) 
+0

Hmm ... Ich habe es versucht ... aber ich lande bei 0 Gerichten. Ich musste AllergyName am Ende in alt.name umbenennen, weil es in Ihrem Beispiel nicht mehr an anderer Stelle benannt wurde. Ich werde weiterhin über die eindeutige Option nachdenken ... das könnte auf der richtigen Spur sein –

+0

dann aktualisieren Sie Ihre Frage fügen Sie ein richtiges Datenmuster (nicht nur Ihre Auswahl) und das damit verbundene erwartete Ergebnis ... jeder Weg besser prüfen, weil in nur mit nicht in Ihrem Ergebnis mit Ei .... – scaisEdge