MySQLのwhere句とサブクエリとしてのavg()による順序付け
質問
エイリアスサブクエリでグループ化および並べ替えを行うことはできますが、where句でエイリアスを使用することはできません。代わりに結合を使用する必要がありますか?
作品:
SELECT entries.*,
(SELECT avg(value)
FROM `ratings`
WHERE ratings.entry_id = entries.id) as avg_rating
FROM `entries`
ORDER BY avg_rating DESC
失敗(" where句の不明な列 'avg_rating'"):
SELECT entries.*,
(SELECT avg(value)
FROM `ratings`
WHERE ratings.entry_id = entries.id) as avg_rating
FROM `entries`
WHERE avg_rating < '4.5000' ORDER BY avg_rating DESC
解決
WHEREの代わりにHAVING句を使用してこれを実行できる場合があります
他のヒント
参加とグループ化を行います。たとえば、
SELECT entries.*, AVG(value)
FROM entries INNER JOIN ratings ON entries.id = ratings.entry_id
GROUP BY entries.*
HAVING AVG(value) < '4.5000'
ORDER BY AVG(value)
擬似コードだけでなく、エントリの列を必要なものだけに制限することをお勧めします。
次のようなエイリアスを使用して回避できる場合があります。
SELECT entries.*, AVG(value) as avg_value
FROM entries INNER JOIN ratings ON entries.id = ratings.entry_id
GROUP BY entries.*
HAVING avg_value < '4.5000'
ORDER BY avg_value
所属していません StackOverflow