2016-05-11 12 views
-2

との平均は、私は次のクエリ持っている場所を選択:私はどこclausuleで「= 3 bnbs.average」を削除とき複数のテーブル

"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"; 

を、クエリは動作しますが、私は計算したいですからALLの平均格付け表の格付け(各bnbは複数の格付けを持つことができます)で各bnbの格付けを行い、格付け= 3、または> 3、または4のすべてのbnbsを選択します。私はあなたがポイントを得ると思う。

誰でも知っていますか?

+0

私はその点を得ていません。いくつかの適切なCREATE文とINSERT文、そして望ましい結果が得られますか? – Strawberry

+0

各bnbの格付けは、別々の表(格付け)に保管されています。平均格付け(例えば、a bnbは複数の格付けを持つことができます - 各格付けは一列に並んでいます)のすべてのbnbを選択するには、3または4と同じです。 – samleurs

答えて

0

選択リストのaverageフィールドは、bnbsテーブルの一部ではなく、計算フィールドです。したがって、mysqlはおそらく未知のフィールドエラーを表示しています。計算されたフィールドは、where句ではなく、having句でフィルタリングできます。

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 

私はそれで任意の場所を基準に表示されていないので、選択リスト内のサブクエリは、すべてのBNBSのレコードの同じ平均を計算します。また、サブクエリを削除して、参加リストのレーティングテーブルを追加し、グループbyを使用することもできます。この場合、表示したい平均のためにhaving節にフィルタリングする必要があります。