MySQL返回OK但没有结果

9
当我尝试在mysql workbench中运行带有子查询的select语句时,我遇到了一个OK响应但没有结果(查询成功)。我确定代码正确,mysql也没有找到任何错误,但我不知道为什么没有得到任何答案。
以下是代码:
SELECT date(created_at),
    (SELECT 
            SUM(amount) AS topup_amount
        FROM
            wallet_transaction
        WHERE
            type = 'topup'
        GROUP BY DATE(created_at)),
    (SELECT 
            SUM(amount) AS admin_add_amount
        FROM
            wallet_transaction
        WHERE
            type = 'admin_add'
        GROUP BY DATE(created_at))
FROM
    wallet_transaction;

4
你是否检查过与查询匹配的记录是否存在?能否展示它们? - Pekka
1个回答

10

看起来你想要的是类似于下面查询产生的结果:

SELECT DATE(wt.created_at)                                    AS dt_created 
     , IFNULL(SUM(IF(wt.type = 'topup'    , wt.amount, 0)),0) AS topup_amount
     , IFNULL(SUM(IF(wt.type = 'admin_add', wt.amount, 0)),0) AS admin_add_amount
  FROM wallet_transaction wt
 GROUP BY DATE(wt.created_at)
原查询存在一些问题。SELECT列表中的子查询最多只能返回一行,否则MySQL会抛出错误。

非常感谢@spencer7593,它完美地运行了,我学到了很多。 - s_ehsan_g
2
@BrianLeishman:我怀疑MySQL实际上会抛出一个错误,而OP代码没有检查它。但这只是一个猜测,没有提供足够的信息来做出诊断。所以我跳过了调试。由于没有示例数据和预期输出的样本,我只是猜测了一个规范,并编写了一个查询来满足该规范。 - spencer7593
1
@spencer7593 我不这么认为,似乎即使在Workbench中有时你只会得到“OK”,如果你有一个子查询返回多行的情况有时会发生,或者我现在有一个情况是一个UDF有时会以某些输入方式执行而没有错误(日志或返回)。 - Brian Leishman
@BrianLeishman:你不这么认为吗?子查询作为SELECT列表中的表达式应该返回一列,而且不超过一行,或者我不怀疑MySQL会抛出错误?至于我提供的答案,我相当确定我的关于子查询作为SELECT列表中的表达式不应该返回多行的说法是正确的。OP观察到的行为也可能是由于wallet_transaction表为空。正如我在之前的评论中提到的,没有提供足够的信息进行明确的诊断。但我确定OP的查询对于一般情况来说是格式错误的。 - spencer7593
1
@BrianLeishman:对于工作台(或任何客户端),当SQL格式不正确时返回“OK”和无结果集,我没有确切的诊断观察到的行为;这不是我深入研究的内容,我更专注于编写有效的SQL。另一种使OP SQL“有效”的方法是在每个子查询中添加LIMIT 1子句。用双引号括起来是因为它只解决了“返回多行”的问题,但SQL并没有返回OP真正想要的结果集。我根据规范猜测并演示了一个满足其要求的查询。 - spencer7593
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接