Hilfe bei abruf Befehlen!

Kimymoon86

Mitglied
Hallo ihr lieben.

Ich möchte eine Rezeptdatenbank machen. So weit bin ich schon.

PHP:
CREATE DATABASE `db` ;

CREATE TABLE `db`.`Naehrwerte` (
`ID` INT NOT NULL ,
`Name` VARCHAR( 100 ) NOT NULL ,
`Kcal` INT NOT NULL ,
`Eiweis` INT NOT NULL ,
`Kohlenhydrate` INT NOT NULL ,
`Fett` INT NOT NULL ,
PRIMARY KEY ( `ID` )
) ENGINE = InnoDB ;


CREATE TABLE `db`.`Rezepte` (
`ID` INT NOT NULL ,
`Name` VARCHAR( 100 ) NOT NULL ,
`Typ` VARCHAR( 20 ) NOT NULL ,
PRIMARY KEY ( `ID` )
) ENGINE = InnoDB;


CREATE TABLE `db`.`Zutaten` (
`Zutat_ID` INT NOT NULL ,
`Rezept_ID` INT NOT NULL ,
`Menge` VARCHAR( 50 ) NOT NULL ,
INDEX ( `Zutat_ID`,`Rezept_ID` ),
FOREIGN KEY (`Rezept_ID`) REFERENCES Rezepte (ID),
FOREIGN KEY (`Zutat_ID`) REFERENCES Naehrwerte (ID)
) ENGINE = InnoDB ;

INSERT INTO `db`.`Rezepte` (`ID`, `Name`, `Typ`) VALUES ('1', 'Palatschinken', 'Vegetarisch'), ('2', 'Tomatensuppe', 'Vegetarisch'), ('3', 'Rindschinkenscheiben', 'Karnivore'), ('4', 'Veganes Haehnchen mit Reis', 'Vegan');


INSERT INTO `db`.`Naehrwerte` (`ID`, `Name`, `Kcal`, `Eiweis`,
`Kohlenhydrate`, `Fett`) VALUES 
('1', 'Ei', '1', '1', '1', '1'), 
('2', 'Mehl', '1', '1', '1', '1'), 
('3', 'Zucker', '1', '1', '1', '1'), 
('4', 'Milch', '1', '1','1', '1'), 
('5', 'Rinderbrust', '1', '1', '1', '1'),
('6', 'Salz', '1', '1', '1', '1'), 
('7', 'Pfeffer', '1', '1', '1', '1'), 
('8', 'Zwiebel', '1', '1', '1', '1'), 
('9', 'Knoblauch', '1', '1', '1', '1'), 
('10', 'Tomatenmark', '1', '1', '1', '1'), 
('11', 'Gemuesebrühe', '1', '1', '1', '1'), 
('12', 'Reis', '1', '1', '1', '1'), 
('13', 'Tomaten', '1', '1', '1', '1'), 
('14', 'Sahne', '1', '1', '1', '1');

INSERT INTO `db`.`Zutaten` (`Zutat_ID`, `Rezept_ID`, `Menge`) VALUES ('12',
'4', '1 Kilo'), ('9', '4', '2 Zehen'), ('6', '4', '10 Gramm'), ('8', '2',
'1 Stueck'), ('13', '2', '6 Stueck'), ('9', '2', '1 Zehe'), ('10', '2', '10
Gramm'), ('11', '2', '1 Liter'), ('14', '2', '50 Mililiter'), ('5', '3',
'1 Kilo'), ('6', '3', '25 Gramm'), ('7', '3', '5 Gramm'), ('3', '3', '2
Gramm'), ('2', '1', '40 Gramm'), ('3', '1', '10 Gramm'),  ('4', '1', '100
Mililiter'),  ('1', '1', '1');

Jetzt würde ich gerne folgendes machen: Nach bestimmten Rezepten suchen, Rezept finden durch Zutaten eingabe, neue Rezepte hinzufügen; jedoch weis ich nicht genau wie. Wäre echt happy wenn ihr mir da helfen könntetn.

Als Code hab ich bis jetzt folgendes:
PHP:
SELECT  
  rezept.name, rezept.zutaten.menge, rezept.zutaten.einheit, zutaten.name 
AS zutaten
FROM  
  `rezept` AS `r` 
INNER JOIN  
  `Zutaten` AS `z` 
ON  
  z.rezept_id = r.id 
INNER JOIN  
  `zutaten` AS `z` 
ON  
  z.id = z.zutaten_id

danke für eure Hilfe
 
Zuletzt bearbeitet:
Ich geh mal von MySQL aus.

Wie du Rezepte eingibst hast du ja bereits. Deine INSERT-Satements.

Aber allgemein:
1) Du solltest keine ä in Namen haben. Nährwerte sollte Naerwerte heissen
2) In deinem SELECT hast du Aliase auf die Tabellen gesetzt. Dann musst du im SELECT-Teil auch die Aliase verwenden und nicht die Tabellennamen
3) Du hast keine Tabelle rezept_zutaten
5) Du verwendest in den ON-Teilen die Aliase i und ri. Du hast diese aber nicht. Du hast z und rz
 
Ja sorry natürlich. Ich habs in MySQL gemacht.
Ok ich hab die "ä's" alle draussen ^^
Bei meinem letzten Befehl hatte ich vergessen die Bezeichnungen zu änern. Wollte es erst auf englisch machen. Wurd mir aber irgendwie zu unübersichtlich. ^^
Ich weis nicht wirklich wie ich mich auf die andern Tabellen berufe. Könntest du mir vielleicht ein Beispiel geben?
 
Zuletzt bearbeitet:
Du hast das doch schon mit dem JOIN.
Ich versteh deine Frage nicht.

Mach mir bitte ein Datenbeispiel mit Tabellen. So in der Art:
Das hab ich:
Code:
Tabelle mitarbeiter
id | firma_id | name
--------------------
1  | 1        | MA1
2  | 1        | MA2
3  | 2        | MA3

Tabelle Firma
id | name
---------------------
1  | firma1
2  | firma2

Nun will ich wissen, welche Firma wieviele Mitarbeiter hat. Das soll dann so aussehen
Code:
firma_id | firma_name | anzahl_mitarbeiter
------------------------------------------
1        | firma1     | 2
2        | firma3     | 1
 
Danke
Ich hab das zwar mit join gemacht, aber ich weis nicht wirklich auf welche tabellen ich mich in meinem Fall berufe. Wenn ich jetzt zutaten eingebe und ein Rezept rauskommen soll inkl. Nährwerte. Welche Tabellen nehm ich dann her? Nehm ich da alle drei Tabellen also
PHP:
SELECT Naehrwerte, Rezept, Zutaten
oder nehm ich da
PHP:
SELECT Naehrwerte.name, Rezept.name, Rezept.typ, ....
das weis ich nicht. Darauf war meine Frage bezogen.
 
Im SELECT-Teil musst du den Namen/Alias der Tabelle nur angeben wenn derselbe Feldnamen in mehreren Tabellen vorkommt. Im Zweifelsfall immer mit angeben.
 
Aha. Das bringt mich schon weiter.
Wenn ich jetzt also ein Rezept abrufen will, dann mach ich das so:
PHP:
SELECT Rezepte.Name, GROUP_CONCAT(Naehrwerte.Name," ", Zutaten.Menge SEPARATOR ',') as Zutaten, SUM(Naehrwerte.KCal) AS KCal, SUM(Naehrwerte.Eiweis) AS Eiweis, SUM(Naehrwerte.Kohlenhydrate) AS Kohlenhydrate, SUM(Naehrwerte.Fett) AS Fett
FROM Rezepte
INNER JOIN Zutaten
ON (Zutaten.Rezept_ID = Rezepte.ID)
INNER JOIN Naehrwerte
ON (Zutaten.Zutat_ID = Naehrwerte.ID)
WHERE
Rezepte.Name = 'Rindschinkenscheiben';

Ist warscheinlich sehr kompliziert aber es geht!

Wie muss ich es anstellen (vom Prinzip her) das ich zutaten eingebe und ich ein rezept bekomme, eines das nur diese Zutaten drin hat?
 
Zuletzt bearbeitet:
Du meinst also, du hast jetzt als Beispiel "Mehl, Eier, Milch, Rosinen". Jetzt willst du alle Rezepte die diese Zutaten haben, aber keine anderen.
Ist das Richtig?
 
Alle Rezepte für die Zutaten b und c
SQL:
SELECT DISTINCT
	zutaten.Rezept_ID
FROM
	zutaten
	LEFT JOIN (
			SELECT DISTINCT
				zutaten.Rezept_ID
			FROM
				zutaten
				LEFT JOIN (SELECT 'b' AS name UNION SELECT 'c') AS selected
					ON selected.name = zutaten.name
			WHERE
				selected.name IS NULL
		) AS not_complete
		ON not_complete.Rezept_ID = zutaten.Rezept_ID
WHERE
	not_complete.Rezept_ID IS NULL

Oder eleganter
SQL:
SELECT
	zutaten.Rezept_ID
FROM
	zutaten
GROUP BY
	Rezept_ID
HAVING
	-- Hier die Zutaten auflisten
	NOT FIND_IN_SET(0, GROUP_CONCAT(DISTINCT zutaten.name IN ('b', 'c')));
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück