USE project; /* ---------------------------------- 1 ---------------------------------- Zu jeder Person soll aufgezeichnet werden, wann dies Person wieviel von welchem Produkt zu sich nimmt. Daraus soll eine Sicht erstellt werden, die anzeigt, wie viel Prozent der Tagesmenge erreicht wurde und wieviel von welchen Nährstoffen konsumiert wurde. Idealerweise gibt es ein Rechtekonzept dafür (ggfs. als SQL-Kommentar im Skript). Wird dabei gegen Vorgaben (Kalorienvorgaben, vegetarisch, Allergene, etc.) verstoßen, so soll das in der Sicht angezeigt werden. Wenn der Tag „ok“ ist, soll das markiert werden, ansonsten soll angezeigt werden, gegen was verstoßen wurde. ----------------------------------------------------------------------- Rechtekonzept: Als normaler Benutzer sollte man nur Zugriff auf seine eigenen Daten haben. Als privilegierter Nutzer (z.B. Admin) kann man alle Daten sehen */ DROP VIEW IF EXISTS Menu_Naehrwerte; CREATE VIEW Menu_Naehrwerte AS ( SELECT Menuname, GROUP_CONCAT(DISTINCT Produktname SEPARATOR ', ') AS 'Produkte', ROUND(SUM(Fett * (SELECT Menge FROM Menge WHERE MengenID = M.MengenID) / 100), 2) AS 'Fett', ROUND(SUM(Kohlenhydrate * (SELECT Menge FROM Menge WHERE MengenID = M.MengenID) / 100), 2) AS 'Kohlenhydrate', ROUND(SUM(Eiweiss * (SELECT Menge FROM Menge WHERE MengenID = M.MengenID) / 100), 2) AS 'Eiweiss', ROUND(SUM(Brennwert * (SELECT Menge FROM Menge WHERE MengenID = M.MengenID) / 100), 2) AS 'Brennwert', GROUP_CONCAT(DISTINCT Allergenbezeichnung SEPARATOR ', ') AS 'Allergene', GROUP_CONCAT(DISTINCT E_Nummer SEPARATOR ', ') AS 'Zusatzstoff' FROM Menu JOIN Menucontent M on Menu.MenuID = M.MenuID JOIN Menge M3 on M.MengenID = M3.MengenID JOIN Produkt P on M3.ProduktID = P.ProduktID JOIN Naehrwerte N on P.ProduktID = N.ProduktID JOIN enthaeltAllergen eA on P.ProduktID = eA.ProduktID JOIN Allergen A on A.AllergenID = eA.AllergenID LEFT JOIN enthaeltZusatzstoff eZ on P.ProduktID = eZ.ProduktID GROUP BY Menuname); DROP VIEW IF EXISTS Aufgabe_5; CREATE VIEW Aufgabe_5 AS ( SELECT Personenvorname, Personenname, Naehrwertziel, MN.Brennwert, CONCAT(ROUND(MN.Brennwert / Naehrwertziel * 100, 2), '%') AS Naehrwertziel_Prozent, MN.Fett, MN.Kohlenhydrate, MN.Eiweiss, IF(MN.Brennwert / Naehrwertziel * 100 <= 100, 'OK', 'Naehrwertziel überschritten') AS Naehrwert_OK, IF((SELECT COUNT(*) FROM (SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(Allergene, ', ', n.digit + 1), ', ', -1) AS Allergen FROM Menu_Naehrwerte INNER JOIN (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) n ON LENGTH(REPLACE(Allergene, ', ', '')) <= LENGTH(Allergene) - n.digit WHERE Menuname = M.Menuname UNION ALL SELECT Allergenbezeichnung FROM Allergie AS A20 JOIN Allergen A10 on A20.AllergenID = A10.AllergenID JOIN Person P10 on A20.PersonID = P10.PersonID WHERE Personenname = P.Personenname) as u_all) = (SELECT COUNT(*) FROM (SELECT DISTINCT SUBSTRING_INDEX( SUBSTRING_INDEX(Allergene, ', ', n.digit + 1), ', ', -1) AS Allergen FROM Menu_Naehrwerte INNER JOIN (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) n ON LENGTH(REPLACE(Allergene, ', ', '')) <= LENGTH(Allergene) - n.digit WHERE Menuname = M.Menuname UNION SELECT Allergenbezeichnung FROM Allergie AS A20 JOIN Allergen A10 on A20.AllergenID = A10.AllergenID JOIN Person P10 on A20.PersonID = P10.PersonID WHERE Personenname = P.Personenname) as u), 'OK', 'Allergenhaltiges Produkt konsumiert') AS 'Allergene_OK', IF((SELECT COUNT(*) FROM (SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(Zusatzstoff, ', ', n.digit + 1), ', ', -1) AS Zusatzstoff FROM Menu_Naehrwerte INNER JOIN (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) n ON LENGTH(REPLACE(Zusatzstoff, ', ', '')) <= LENGTH(Zusatzstoff) - n.digit WHERE Menuname = M.Menuname UNION ALL SELECT Z.E_Nummer FROM Zusatzstoffunvertraeglichkeit AS Z20 JOIN Zusatzstoff Z on Z20.E_Nummer = Z.E_Nummer JOIN Person P10 on Z20.PersonID = P10.PersonID WHERE Personenname = P.Personenname) as u_all) = (SELECT COUNT(*) FROM (SELECT DISTINCT SUBSTRING_INDEX( SUBSTRING_INDEX(Zusatzstoff, ', ', n.digit + 1), ', ', -1) AS Zusatzstoff FROM Menu_Naehrwerte INNER JOIN (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) n ON LENGTH(REPLACE(Zusatzstoff, ', ', '')) <= LENGTH(Zusatzstoff) - n.digit WHERE Menuname = M.Menuname UNION SELECT Z.E_Nummer FROM Zusatzstoffunvertraeglichkeit AS Z20 JOIN Zusatzstoff Z on Z20.E_Nummer = Z.E_Nummer JOIN Person P10 on Z20.PersonID = P10.PersonID WHERE Personenname = P.Personenname) as u), 'OK', 'Zusatzstoffhaltiges Produkt konsumiert') AS 'Zusatzstoff_OK' FROM konsumiert JOIN Menu M on M.MenuID = konsumiert.MenuID JOIN Person P on P.PersonID = konsumiert.PersonID JOIN Menu_Naehrwerte MN on M.Menuname = MN.Menuname);