我在使用MySQL时遇到了一些麻烦。

这是我使用的查询:

SELECT
    COALESCE(SUM(`a`.`battles`), 0) AS `battles`
FROM
    `account_stats` AS `a`
WHERE
    `a`.`account_id` = 12345
GROUP BY
    `a`.`account_id`


account_stats不为空,但没有带account_id = 12345的行。

我希望MySQL返回0战而不是Empty set。但是即使使用COALSECE或IFNULL,它也会返回Empty set

当我删除GROUP BY时,一切正常,但是我需要它来计算战斗的总和。

有没有解决此问题的方法?

最佳答案

如果只需要一个帐户的信息,则希望查询返回值0的行时可以使用条件聚合:

SELECT SUM(CASE WHEN a.account_id = 12345 THEN a.battles ELSE 0 END) as battles
FROM account_stats a;


如果表不为空,则不需要coalesce()

如果您在account_id上有一个索引并且表很大,则以下操作可能会更有效,因为子查询将使用索引,而查询的其余部分将只处理一行:

SELECT x.account_id, COALESCE(SUM(a.battles), 0) as battles
FROM (SELECT 12345 as account_id
     ) x LEFT JOIN
     (SELECT a.account_id, SUM(a.battles) as battles
      FROM account_stats a
      WHERE a.account_id = 12345
     ) a
     ON x.account_id = a.account_id;

10-04 12:13