Mysql

創建計算列

  • February 7, 2016

我想創建一個評分權重,我需要計算 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都會有一個“文件排序”。

引用自:https://dba.stackexchange.com/questions/128504