andste72
Goto Top

N zu m Datenbankabfrage und keine Ahnung wie ich Abfragen soll

Ich habe folgendes Problem:

Tabelle 1

Rezepte
id
name

Tabelle 2

Zutaten
id
name


Tabelle 3
rezept_zutat
rid - RezeptID
zid = ZutatID

Bei der Anlage des Rezeptes füge ich für jede Zutat eine Zeile in der Tabelle 3 ein (z.B. rid 1 für Kuchen und zid 1 - Zucker, rid 1 und zid 2 für Mehl)

Ich möchte jetzt, dass er mir z.B. Rezept 1 - Kuchen mit all seinen Zutaten anzeigt. Er soll mir aber auch alle Zutaten anzeigen, die nicht zugewiesen sind, weil ich ja vielleicht später der Meinung bin, es könnte noch Schokolade dazu.

Mein Problem ist, dass ich keine Ahnung habe, wie ich die Abfrage angehen soll.

Kann mir jemand helfen?

Danke

Content-ID: 204334

Url: https://administrator.de/forum/n-zu-m-datenbankabfrage-und-keine-ahnung-wie-ich-abfragen-soll-204334.html

Ausgedruckt am: 22.12.2024 um 19:12 Uhr

Grinskeks
Grinskeks 03.04.2013 um 13:22:08 Uhr
Goto Top
Hallo,

gehen wir mal davon aus, das Rezept hat die ID 5 könnte die Abfrage in etwa so aussehen:

Select Zutat.name as Zutat, case when rid = 5 then 1 else 0 end as Zugewiesen,
Rezepte.Name as Rezept
from Zutaten left join rezept_zutat on
Zutaten.id = rezept_zutat.zid
left join Rezepte
on rezept_zutat.rid = Rezept.id

where rezept_zutat.rid = 5


/*
Zeige alle möglichen Zutaten zu einem Rezept 5 an und markiere die verwendeten Zutaten als zugewiesen.
Zeige zusätzlich den Namen des Rezeptes an.

*/


Gruss Grinskeks
andste72
andste72 03.04.2013 um 15:18:04 Uhr
Goto Top
Hei Ginskeks,

habe jetzt folgendes Werte eingetragen:

Rezept Zutaten Rezept_Zutaten
id name id name rid zid
1 Kuchen 1 Zucker 1 1
2 Schnitzel 2 Mehl 1 2
3 Muffins 3 Wasser 2 5
4 Hefe
5 Schweinefleisch


Ich nehme jetzt Deinen Entwurf und mit der Rezept ID 1. Aus Ausgabe bekomme ich:

Zutat Zugewiesen Rezept
Zucker 1 Kuchen
Mehl 1 Kuchen

und das war es. Jetzt müsste aber noch:

Wasser 0 NULL
Hefe 0 NULL
Schweinefleisch 0 NULL

oder so ähnlich angezeigt werden, damit ich es z.B. auf Hefe 1 Kuchen ändern kann.
andste72
andste72 03.04.2013 um 15:30:54 Uhr
Goto Top
Ich glaub ich habs:

select rz.*, z.name as Zutat, case when rid = 2 then 1 else 0 end as zugewiesen
from rezept_zutaten rz
right join zutaten z on rz.zid = z.id

Vielen Dank für die Hilfe!!
andste72
andste72 04.04.2013 aktualisiert um 09:35:31 Uhr
Goto Top
Hei, face-sad
war es doch nicht!!

Würde funktionieren, solange z.B. Zucker nur einem Rezept zugewiesen wäre. Kommt das 2. Rezept dazu, habe ich Zucker auch einmal als zugewiesen und einmal als nicht zugewiesen.
andste72
andste72 04.04.2013 um 10:14:05 Uhr
Goto Top
jetzt aber:

select z.*, ab.*
from zutaten z
left join (select r.*, rz.zid from rezept r left join rezept_zutaten rz ON r.id = rz.rid where r.id = 1) ab ON z.id = ab.zid

Gruß
nxclass
nxclass 04.04.2013 um 10:17:25 Uhr
Goto Top
SELECT `Rezepte`.*, `Zutaten`.*
FROM `Rezept_Zutat`
  FULL JOIN `Rezepte` ON `Rezepte`.id = `Rezept_Zutat`.rid
  FULL JOIN `Zutaten` ON `Zutaten`.id = `Rezept_Zutat`.zid
WHERE
  `Rezepte`.id IN ( 1, 2 )
ORDER BY `Rezepte`.id, Zutaten`.id
... entspricht dies deiner Anforderung ?