mysql - COUNT() MySQL 中 MAX() 出现的次数

标签 mysql

我有一个捐赠数据库,在我针对该数据库运行的一份报告中,我想包含等于月份最大捐赠的捐赠数量。例如,月份最高捐款可能是 100 美元,但可能有 5 个人都捐款了 100 美元,我想知道这个数字。

我当前的查询是:

SELECT SUM(mc_gross) AS Donations,
       SUM(mc_fee) AS Fees,
       COUNT(payment_date) AS DontationCount,
       COUNT(DISTINCT payer_email) AS DonatorCount,
       MAX(mc_gross) AS MaxDonation,
       @MaxD:=MAX(mc_gross),
       (
            SELECT COUNT(*)
            FROM #__paypal_donations
            WHERE MONTH(payment_date) = MONTH(CURDATE())
            AND YEAR(payment_date) = YEAR(CURDATE())
            AND mc_gross = @MaxD
       ) as MaxDonationMultiplier,
       AVG(mc_gross) AS AverageDonation
FROM #__paypal_donations
 WHERE MONTH(payment_date) = MONTH(CURDATE())
   AND YEAR(payment_date) = YEAR(CURDATE())

所以我想我可能已经接近了,但看起来我存储在 @MaxD 中用于子查询的值不起作用,或者 mc_gross = @MaxD 中的比较本身不起作用,因为如果我替换 @MaxD有了实际值,我就得到了正确的计数。

最佳答案

您不能依赖 MySQL 中表达式的赋值顺序。这使得像你这样的查询非常危险。幸运的是,您可以使用相关子查询轻松解决此问题:

SELECT SUM(mc_gross) AS Donations, SUM(mc_fee) AS Fees, COUNT(payment_date) AS DontationCount,
       COUNT(DISTINCT payer_email) AS DonatorCount, MAX(mc_gross) AS MaxDonation,
       (SELECT COUNT(*)
        FROM #__paypal_donations pd2
        WHERE MONTH(pd2payment_date) =  MONTH(pd.payment_date)) AND
              YEAR(pd2payment_date) = YEAR(pd.payment_date) AND
              pd2.mc_gross = MAX(mc_gross)
       ) as MaxDonationMultiplier,
       AVG(mc_gross) AS AverageDonation
FROM #__paypal_donations pd
WHERE MONTH(payment_date) = MONTH(CURDATE()) AND
      YEAR(payment_date) = YEAR(CURDATE());

关于mysql - COUNT() MySQL 中 MAX() 出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27742002/

相关文章:

python - 在 Heroku 上使用 Python/Django 访问 ClearDB 数据库被拒绝

mysql - 如何在不删除现有内容的情况下更新mysql表

mysql - 在扑克牌中找到四张相同的牌

php - 如何从两个表中获取特定数据?

mysql - CASE WHEN IN ({一组数字})

mysql - PHPmyadmin 3.4.9 导出到 CSV 的问题

mysql - 如何使用 INNER JOIN 在 UPDATE 上多次添加值?

php 输出不显示第一项详细信息和错误

mysql - 如何在mysql表的列中按值添加分组

php - 如何使用 imap 更快地读取多条消息状态