Hallo an alle!
Ich habe eine größere Bibliotheksverwaltungsdatenbank (Firbird-basiert) mit folgenden - auf die wichtigsten Spalten reduzierte - Tabellen (mögliches Beispiel darunter):
Medien (ID, Autor, Titel, ISBN, Signatur)
38, Goethe, Faust, 12345, 05Y2-LM-DE.
MedienExemplare (ID, Medium, Status)
798, 38, 2 (=> Status 2 bedeutet "ausgeliehen")
799, 38, 0 (=> Status 0 bedeutet "nicht ausgeliehen")
Es gibt 2 Exemplare vom Medium 38, weil es 2x die gleiche Faust-Ausgabe in der Bibliothek gibt. Die Spalte "Medium" in der Tabelle "Medienexemplare" ist also ein Fremdschlüssel und verweist auf die ID in der Tabelle "Medien".
Ich möchte nun folgende Ausgabe haben:
Autor | Titel | ISBN | verfügbar | ausgeliehen
------------------------------------------------------------
Goethe | Faust | 12345 | 1 | 1
Meine Lösung funktioniert, erscheint mir aber zu komplex und ist überaus langsam:
Die Signatur kann mal hinten "LM-DE" oder "LM DE" lauten, je nachdem, wie inkonsistent leider das Buch in die Datenbank aufgenommen wurde.
Es erscheint mir irgendwie unlogisch, 2x fast das gleiche abzufragen und einmal eine Tabelle zu kreieren, in der am Ende eine Spalte "verfügbar" ergänzt ist und einmal eine zweite neue Tabelle mit einer letzten Spalte "verliehen" und diese beiden neuen Tabellen noch einmal zu "full joinen".
Ich bin noch zu unerfahren mit effektiven SQL-Abfragen und freue mich sehr über Tipps und Hilfen!!
DANKE!
Ich habe eine größere Bibliotheksverwaltungsdatenbank (Firbird-basiert) mit folgenden - auf die wichtigsten Spalten reduzierte - Tabellen (mögliches Beispiel darunter):
Medien (ID, Autor, Titel, ISBN, Signatur)
38, Goethe, Faust, 12345, 05Y2-LM-DE.
MedienExemplare (ID, Medium, Status)
798, 38, 2 (=> Status 2 bedeutet "ausgeliehen")
799, 38, 0 (=> Status 0 bedeutet "nicht ausgeliehen")
Es gibt 2 Exemplare vom Medium 38, weil es 2x die gleiche Faust-Ausgabe in der Bibliothek gibt. Die Spalte "Medium" in der Tabelle "Medienexemplare" ist also ein Fremdschlüssel und verweist auf die ID in der Tabelle "Medien".
Ich möchte nun folgende Ausgabe haben:
Autor | Titel | ISBN | verfügbar | ausgeliehen
------------------------------------------------------------
Goethe | Faust | 12345 | 1 | 1
Meine Lösung funktioniert, erscheint mir aber zu komplex und ist überaus langsam:
PHP:
$sql =
"SELECT DISTINCT frei.Autor, frei.Titel, frei.ISBN, frei.verfuegbar, weg.verliehen
FROM
( SELECT m.ID, m.Autor, m.Titel, m.ISBN, COUNT(m.ISBN) AS verfuegbar
FROM Medien m INNER JOIN MedienExemplare ex
ON m.ID = ex.Medium
WHERE ex.Status = 0
AND m.Signatur Like '05Y2-LM DE%'
OR m.Signatur Like '05Y2-LM-DE%'
GROUP BY m.ID, m.Autor, m.Titel, m.ISBN ) frei
FULL JOIN
( SELECT ex.Medium, COUNT(m.ISBN) AS verliehen
FROM Medien m INNER JOIN MedienExemplare ex
ON m.ID = ex.Medium
WHERE ex.Status = 2
AND m.Signatur Like '05Y2-LM DE%'
OR m.Signatur Like '05Y2-LM-DE%'
GROUP BY ex.Medium, m.ISBN ) weg
ON frei.ID = weg.Medium
ORDER BY frei.Titel
";
Die Signatur kann mal hinten "LM-DE" oder "LM DE" lauten, je nachdem, wie inkonsistent leider das Buch in die Datenbank aufgenommen wurde.
Es erscheint mir irgendwie unlogisch, 2x fast das gleiche abzufragen und einmal eine Tabelle zu kreieren, in der am Ende eine Spalte "verfügbar" ergänzt ist und einmal eine zweite neue Tabelle mit einer letzten Spalte "verliehen" und diese beiden neuen Tabellen noch einmal zu "full joinen".
Ich bin noch zu unerfahren mit effektiven SQL-Abfragen und freue mich sehr über Tipps und Hilfen!!
DANKE!