Mysql
創建計算列
我想創建一個評分權重,我需要計算 AVG,然後找到 COUNT 並將兩者相乘以獲得權重。我有類似的東西:
SELECT post_id, COUNT(CASE WHEN vote > 0 THEN vote ELSE NULL END) AS voters, AVG(CASE WHEN vote > 0 THEN vote ELSE NULL END) AS average FROM wp_imdb_rating GROUP BY post_id ORDER BY voters * average DESC LIMIT 0, 100
但它說:
#1247 - 不支持引用“選民”(引用組函式)
我可以分別按平均和選民排序,但我不能將它們與任何公式結合起來。如何在 order 子句中使用包含 AVG 和 COUNT 值的公式?
謝謝。
這似乎是優化器的一些舊限制,在 ORDER BY 中更複雜的表達式中不允許聚合表達式的別名。
您可以通過使用完整表達式而不是別名來解決它:
ORDER BY COUNT(CASE WHEN vote > 0 THEN vote ELSE NULL END) * AVG(CASE WHEN vote > 0 THEN vote ELSE NULL END)
另一種解決方案,可能具有相同的性能:
SELECT * FROM ( SELECT post_id, COUNT(IF(vote > 0, vote, NULL) AS voters, AVG(IF(vote > 0, vote, NULL) AS average FROM wp_imdb_rating GROUP BY post_id ) ORDER BY voters * average DESC LIMIT 0, 100
注意:每當
ORDER BY
與 不同時GROUP BY
,都會有一個“文件排序”。