我有一个表格如下:
log(log_id, log_success (bool), log_created)
我想选择并返回3列date
success
和no_success
,其中前者在表中不存在,最后聚合它们按天计算。
我创建了这个查询:
SELECT
log_created as 'date'
COUNT(*) AS 'count',
SUM(log_success) AS 'success'
SUM('count' - 'success') AS 'no_success'
FROM send_log
GROUP BY DATE_FORMAT(log_created, '%Y-%m-%d');
我可以通过这个查询来实现它吗?我的语法正确吗?
谢谢。
最佳答案
您不能在同一 select 子句中重复使用在 select 中定义的别名。原因是当您访问它时它可能还没有被定义。但是,您可以很容易地重复这个逻辑:
SELECT
log_created AS date,
SUM(log_success) AS success,
COUNT(*) - SUM(log_success) AS no_success,
FROM send_log
GROUP BY
log_created;
我不知道您为什么在查询的group by子句中调用DATE_FORMAT
。 DATE_FORMAT
通常是一个表示层函数,您调用它是因为您想要查看以某种方式格式化的日期。由于 log_created
似乎已经是一个日期,因此聚合时无需对其调用 DATE_FORMAT
。您甚至不需要在 select 子句中使用,因为 MySQL 日期的默认格式已经是 Y-m-d
。
关于MySQL 将求和值和虚拟列返回为 (count - sum),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55089288/