4

このようなことをすることは可能ですか?

SELECT 
  `e`.*, 
  `rt`.`review_id`, 
  (SUM(vt.percent) / COUNT(vt.percent)) AS rating 
FROM `catalog_product_entity` AS `e` 
INNER JOIN `rating_option_vote` AS `vt`
  ON vt.review_id = e.review_id 
WHERE (rating >= '0') 
GROUP BY `vt`.`review_id`

特に、除算結果の値にwhere条件を付けたいと思います

4

4 に答える 4

7

これは、HAVING句を使用して実行できます。

SELECT e.*, rt.review_id, (SUM(vt.percent) / COUNT(vt.percent)) AS rating 
FROM catalog_product_entity AS e 
INNER JOIN rating_option_vote AS vt ON e.review_id = vt.review_id 
GROUP BY vt.review_id
HAVING (SUM(vt.percent) / COUNT(vt.percent)) >= 0
ORDER BY (SUM(vt.percent) / COUNT(vt.percent)) ASC

注:ORDER BYステートメントを配置する場所を追加しました

クエリオプティマイザも平均を複数回計算するべきではないので、ここでは問題になりません。

@jagraの回答で述べたように、AVG()代わりに使用できるはずですSUM() / COUNT()

于 2013-03-26T17:46:59.200 に答える
2

HAVING次の句を使用できます。

SELECT 
  `e`.*, 
  `rt`.`review_id`, 
  (SUM(vt.percent) / COUNT(vt.percent)) AS rating 
FROM `catalog_product_entity` AS `e` 
INNER JOIN `rating_option_vote` AS `vt`
  ON vt.review_id = e.review_id 
GROUP BY `vt`.`review_id` 
HAVING rating >= 0;

ドキュメントに示されているように、質問にMySQLのタグが付けられているため、このソリューションは機能するはずです。

...標準SQLでは、GROUP BY句を含むクエリは、GROUPBY句で指定されていないHAVING句の非集計列を参照できません。MySQL拡張機能を使用すると、このような列を参照して計算を簡素化できます。..。

この拡張機能は、公式のMySQLコンパイルでデフォルトで有効になっています。

参照:http ://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html (ページ上の単語の最初の出現HAVING

于 2013-03-26T17:49:04.020 に答える
1

集計関数でフィルタリングする場合は、HAVING句を使用する必要があります。

SELECT 
  # `e`.*, => is this needed
  `rt`.`review_id`, 
  (SUM(vt.percent) / COUNT(vt.percent)) AS rating 
  AVG(vt.percent) AS rating1 # same as above 
FROM `catalog_product_entity` AS `e` 
INNER JOIN `rating_option_vote` AS `vt`
  ON vt.review_id = e.review_id 
GROUP BY `vt`.`review_id`
HAVING AVG(vt.percent) > 0

他の2つのメモ:

1)SUM(x)/ COUNT(x)<=> AVG(x)

2)e。*をselectに含めていますが、groupbyには含めていません。MySqlはそれを可能にしますが、他のデータベースはそれを行いません。

于 2013-03-26T18:05:19.690 に答える
0

HAVING集計条件(お持ちの条件など)に使用します

SELECT `e`.*, `rt`.`review_id`, (SUM(vt.percent) / COUNT(vt.percent)) AS rating 
FROM `catalog_product_entity` AS `e` 
INNER JOIN `rating_option_vote` AS `vt`
    ON vt.review_id = e.review_id 
WHERE ( rating >= '0') 
GROUP BY `vt`.`review_id'
HAVING (SUM(vt.percent) / COUNT(vt.percent)) > 0
于 2013-03-26T17:49:43.333 に答える