PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Komplizierte Abfrage



Viech
22.02.2009, 17:50
Hi Leute,

habe mich gerade hier angemeldet, weil ich echt nicht mehr weiterkomme. Seit einer Woche versuche ich, eine SQL Abfrage hinzubekommen. Aber ich komm einfach nicht mehr weiter.

Es geht um folgendes:
Ich will die Namen und Orte von Hotels und den Durchschnitt der Bewertungen für diese Hotels in einer Zeile ausgeben lassen.

Die Datenbankstruktur ist dabei folgende:
Es gibt die Tabellen "hotels", "rooms", "bookings" und "ratings". Ein Hotel hat mehrere Rooms. Ein Room hat mehrere Bookings. Und ein Booking hat genau ein Rating. Ich hänge mal zur Verdeutlichung eine grobe Skizze an.

Folgendes ist mein aktueller Versuch:



SELECT
a.name,
a.ort,
avg(d.rating)
FROM
hotels a,
ratings d
WHERE
d.bookingID = (SELECT id
FROM bookings
WHERE roomID = (SELECT id
FROM rooms
WHERE hotelID = '1'))
GROUP BY d.bookingID;


Das funktioniert aber nicht, weil die letzte Subquery mehrere Zeilen zurückgibt, weil natürlich mehrere Rooms zu einem Hotel gehören.

Aber was ich vorhabe muss doch irgendwie gehen?! Ich bin mit meinem Latein am Ende, hoffentlich könnt ihr mir helfen. Ich freue mich über jeden Tip.

schöne Grüße,
Viech

Mikes-PCHilfe
23.02.2009, 08:53
Kannst du mal nen SQL Dump mit Beispiel Daten als ZIP anhängen, dass ist einfacher wenn ich direkt testen kann, als nur was hinzuschreiben

Viech
23.02.2009, 11:43
Wie erzeuge ich denn so ein SQL Dump? Ich hab jetzt erstmal ne hotel.sql angehängt, in der die DB und die Tabellen angelegt und mit Beispieldaten gefüllt werden. Vielleicht geht das ja auch?

Mikes-PCHilfe
23.02.2009, 19:40
Ok, danke.

Teste ich morgen und gebe Feedback

Mikes-PCHilfe
24.02.2009, 08:21
SELECT h.*,avg(rt.rating) FROM hotels h, rooms r, bookings b, ratings rt WHERE r.hotelID = h.id AND b.roomID = r.id AND b.id = rt.bookingId GROUP BY h.id

Funktioniert problemlos...

Aber du solltest über alle Id noch Indexe legen, damits später performanter wird

Mikes-PCHilfe
24.02.2009, 08:23
Wenn ein Booking = 1 Rating hat, warum machst du dann 2 Tabellen? Dann kannst du dir den Join auch sparen und packst das in eine Tabelle rooms

Viech
24.02.2009, 21:37
1. Super, Danke! Du hast mir echt geholfen!

2. Ich hab das erst so gemacht, weil ich es für übersichtlicher hielt. Und weil ich mir ne schöne Tabellenstruktur aufbauen wollte :o
Aber eigentlich hast du recht, einfacher wärs wenn ich alles in rooms packe. Aber so hab ich wieder was gelernt :thumbsup:

Mikes-PCHilfe
25.02.2009, 08:15
Hallo,

normalisiert ist das ja bestens, nur die Verbindung zu ratings macht keinen Sinn, außer zu erwartenden Performance-Problemen bei großen Daten, da ein weiterer JOIN gespart werden könnte.

Und wie gesagt, denk an die Indexe auf den IDs

Grüße Mike