Frage von ChaosTheory87, 58

Wie fülle ich eine Datenbanktabelle mit Daten aus zwei anderen Tabellen?

Hallo zusammen, brauche jetzt die MySQL-Spezialisten unter euch. Für eine Seminararbeit (prototypische Implementierung einer Schulklassenbibliothek) habe ich jetzt drei Tabellen erstellt:

  • student (id, prename, surname, class) [id ist primary key]
  • book (id, title, author, publisher, year, isbn, pages) [id ist primary key]
  • lend (idbook, idstudent) [beides foreign key mit Referenz zu jeweiligem primary key]

Jetzt brauche ich ein SQL-Statement, das die Tabelle 'lend' bei einem Verleihvorgang befüllt, so nach dem Prinzip:

INSERT INTO lend SELECT id FROM book WHERE title='Musterbuch' AND SELECT id FROM student WHERE prename='Max' AND surname='Mustermann'.

Wie mach ich das am geschicktesten? Muss bestimmt was total Verschachteltes sein, oder?

Danke schon mal!

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Spirit528, 29

Warum soll das unbedingt durch ein einziges SQL-Statement passieren und nicht über die Client-Software?

Nur mit SQL ging es (theoretisch) so:

INSERT INTO lend(idbook, idstudent) VALUES((SELECT id FROM book WHERE title='Musterbuch' LIMIT 1), (SELECT id FROM student WHERE prename='Max' AND surname='Mustermann' LIMIT 1))

Kommentar von ChaosTheory87 ,

Und manchmal ist es doch so simpel... :)

Vielen Dank! Hat einwandfrei funktioniert.

Antwort
von wotan38, 3

Mach es so, wie Du diese Aufgabe ohne Datenbank lösen würdest. Das geht ohne Datenbankkenntisse, SQL und irgendwelche Tricks nur mit gesundem Menschenverstand ganz gut.

Wenn Du ein Buch ausleihst, steht das betreffende Buch schon in der Tabelle book, denn alle vorhandenen Bücher sind ja vorher schon registriert worden. Der betreffende Student steht auch schon in der Tabelle student, weil er vermutlich sich schon früher was ausgeliehen hat und dabei registriert wurde. Nur wenn ein Student sich das erstemal ein Buch ausleiht, muss er vorher registriert werden. Das ist aber ein eigener Vorgang, der nicht jedesmal beim Ausleihen neu durchgeführt werden muss. Genauso ist die Anschaffung eines neuen Buches. Das muss dann erst einmal in der Tabelle book aufgenommen werden und hat mit dem Ausleihvorgang gar nichts zu tun. Wie Du siehst, kommt das im praktischen Betrieb gar nicht vor, drei Sätze auf einmal in die verschiedenen Tabellen eintragen zu müssen.

Übrigens: In der Tabelle lend vermisse ich das Ausleihdatum und Angaben zur Ausleihfrist. Oder muss er das Buch nicht wiederbringen?

Ich würde den Ausleihvorgang in mehreren Schritten durchführen:

1. Eingabe der id des Studenten > Student wird angezeigt oder Anzeige nicht gefunden.

2. Das auszuleihende Buch durch Eingabe der id aufrufen (über den Titel ist das zu umständlich und fehlerträchtig), die id sollte vorne im Buch zu finden sein. Für Notfälle sollte das Buch auch über den Titel aufgerufen werden können. Buch wird angezeigt (mit Titel und Author zur Kontrolle) oder Anzeige nicht gefunden.

3. Wenn korrekt, Eingabebutton, wenn nicht, dann weiter.

4. Zurück auf Punkt 2, wenn weiteres Buch zum Ausleihen ansteht oder Leihvorgang beenden.

Zu 1: Hier sollte noch geprüft werden, wieviele Bücher sich momentan im Besitz des Student schon befinden (eventuell Limit erreicht) oder die Leihfrist abgelaufen ist.


Antwort
von RakonDark, 35

nicht AND sondern UNION

und dann müssen die felder  passend sein , bzw ausgewählt werden .

vielleicht noch klammer drum


Kommentar von ChaosTheory87 ,

Prinzipiell scheinbar schon mal richtiger, allerdings wird jetzt noch ein

ERROR 1136 (21S01): Column count doesn't match value count at row 1

ausgespuckt.. Spiele grad noch bisschen mit den Klammern etc rum.

Kommentar von RakonDark ,

die anzahl der felder sind nciht richtig

beispiel :

tabelle1 felder : erstes,zweites

tabelle2 felder : dies, das

tabelle3 felder : jenes, welches

insert into tabelle1 select dies,'' from tabelle2 union select jenes,'' from tabelle3
Kommentar von RakonDark ,

oh hab gar nicht gesehen , das du zwei werte unterschiedlicher tabellen in eine tabelle haben willst . dann klappt mein union natürlich nicht .

Kommentar von ChaosTheory87 ,

Kein Problem, trotzdem danke für die Hilfe!

Keine passende Antwort gefunden?

Fragen Sie die Community