2016-05-11 12 views
-2

Ich habe die folgende Abfrage:wählen, in dem Durchschnitt mit mehreren Tabellen

"SELECT 
    bnbs.name, 
    bnbs.slug, 
    bnbs.city, 
    bnbs.website, 
    bnbs.description, 
    bnbs.profile_picture, 
    bnbs.price_low, 
    (SELECT AVG(ROUND((ratings.rating_room+ratings.rating_cleanliness+ratings.rating_service+ratings.rating_meals+ratings.rating_general)/5)) FROM ratings) AS average 
FROM 
    bnbs 
     JOIN 
      accounts 
       ON 
        bnbs.account_id = accounts.account_id 
WHERE 
    bnbs.average = 3 
AND 
    bnbs.visible = 1 
AND 
    accounts.active = 1 
AND 
    accounts.confirmed = 1"; 

Als ich die „bnbs.average = 3“ in der where clausule entfernen , die Abfrage funktioniert, aber ich möchte, dass die zur Berechnung Durchschnittliche Bewertung von ALLE die Bewertungen für jedes bnb in der Tabelle Bewertungen (jedes bnb kann mehr als eine Bewertung haben), und ich möchte alle bnbs auswählen, wo die Bewertung = 3 oder> 3 oder 4, ... Ich denke, Sie verstehen es.

Wer hat eine Idee?

+0

Ich verstehe nicht den Punkt. Irgendeine Chance auf einige richtige CREATE- und INSERT-Anweisungen UND ein gewünschtes Ergebnis? – Strawberry

+0

Die Bewertungen für jedes bnb sind in einer separaten Tabelle (Bewertungen) gespeichert. In wollen alle bnbs, wo die durchschnittliche Bewertung (z. B. ein bnb kann mehrere Bewertungen haben - jede Bewertung in einer Reihe) ist wie 3 oder 4. – samleurs

Antwort

0

Das Feld average in der Auswahlliste ist ein berechnetes Feld, das nicht Teil der bnbs-Tabelle ist. Daher gibt mysql wahrscheinlich einen unbekannten Feldfehler aus. Berechnete Felder können in der having-Klausel und nicht in der where-Klausel gefiltert werden.

SELECT 
    bnbs.name, 
    bnbs.slug, 
    bnbs.city, 
    bnbs.website, 
    bnbs.description, 
    bnbs.profile_picture, 
    bnbs.price_low, 
    (SELECT AVG(ROUND((ratings.rating_room+ratings.rating_cleanliness+ratings.rating_service+ratings.rating_meals+ratings.rating_general)/5)) FROM ratings) AS average 
FROM 
    bnbs 
     JOIN 
      accounts 
       ON 
        bnbs.account_id = accounts.account_id 
WHERE 
    bnbs.visible = 1 
AND 
    accounts.active = 1 
AND 
    accounts.confirmed = 1 
HAVING average = 3 

jedoch die Unterabfrage in der Auswahlliste berechnet den gleichen Durchschnitt für alle BnBs Aufzeichnungen, da ich sehe keine wo Kriterien darin. Sie können die Unterabfrage auch entfernen und die Bewertungstabelle in der Join-Liste hinzufügen und die Gruppierung nach verwenden. In diesem Fall müssen Sie immer noch in die having-Klausel für die Durchschnittswerte filtern, die Sie sehen möchten.