Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL没有正常运行_Mysql_Stored Procedures_Having - Fatal编程技术网

MySQL没有正常运行

MySQL没有正常运行,mysql,stored-procedures,having,Mysql,Stored Procedures,Having,我有一个问题: SELECT I.Id , CAST(SUBSTRING_INDEX(GROUP_CONCAT(I.StatusId ORDER BY I.TransactionId DESC), ',', 1) AS UNSIGNED) AS StatusId , SUM(I.RefundAmount) AS RefundAmount FROM ( SELECT I.Id , IT.Id AS TransactionId

我有一个问题:

SELECT I.Id
    , CAST(SUBSTRING_INDEX(GROUP_CONCAT(I.StatusId ORDER BY I.TransactionId DESC), ',', 1) AS UNSIGNED) AS StatusId
    , SUM(I.RefundAmount) AS RefundAmount
    FROM (
        SELECT I.Id
            , IT.Id AS TransactionId
            , IT.StatusId
            , IF(IT.TypeId = 2, IT.RefundAmount, 0) AS RefundAmount
            FROM Items I
            INNER JOIN ItemTransactions IT ON IT.ItemId = I.Id
            WHERE I.Id = someValue
    ) I
    GROUP BY I.Id
    HAVING StatusId = 1 AND RefundAmount = 0
其中Items表的事务记录存储在ItemTransactions表中。我一直在使用这种类型的查询,直到现在,having子句出现了一些问题

查询在SQL编辑器中工作,但在存储过程中使用时无法正常工作。别误会,我的大多数存储过程都使用了这个查询。每行调试一行,发现having子句存在问题

作为临时修复,我将查询更改为:

SELECT I.Id
    , I.StatusId
    , I.RefundAmount
    FROM (
        SELECT I.Id
            , CAST(SUBSTRING_INDEX(GROUP_CONCAT(I.StatusId ORDER BY I.TransactionId DESC), ',', 1) AS UNSIGNED) AS StatusId
            , SUM(I.RefundAmount) AS RefundAmount
            FROM (
                SELECT I.Id
                    , IT.Id AS TransactionId
                    , IT.StatusId
                    , IF(IT.TypeId = 2, IT.RefundAmount, 0) AS RefundAmount
                    FROM Items I
                    INNER JOIN ItemTransactions IT ON IT.ItemId = I.Id
                    WHERE I.Id = someValue
            ) I
            GROUP BY I.Id
            --HAVING StatusId = 1 AND RefundAmount = 0
    ) I
    WHERE I.StatusId = 1 AND I.RefundAmount = 0
查询工作正常。但我想知道是否有人已经遇到了这个问题,并找到了解决办法。我正在使用MySQL 5.0

感谢WHERE子句用于过滤有关公共属性和表达式的数据。HAVING子句用于在执行groupping后过滤数据,其参数应为GROUP BY子句的参数或包含聚合函数的表达式。 在WHERE、GROUP BY或HAVING子句中使用列的别名也是非法的,而它确实适用于ORDER BY子句

正如您所发现的,一个选项是使用子查询,然后列引用将起作用。 另一个是复制HAVING子句中的整个表达式:

选择I.Id, CASTSUBSTRING_INDEXGROUP_CONCATI.StatusId订单由I.TransactionId描述, “,”,1与StatusId一样未签名, SUMI.退款金额作为退款金额 从…起 选择I.Id ,IT.Id作为TransactionId ,IT.StatusId ,IFIT.TypeId=2,IT.RETURNAMOUNT,0作为RETURNAMOUNT 第I项 内部联接项在其上进行事务处理。ItemId=I.Id 其中I.Id=someValue 我 按身份证分组 有 CASTSUBSTRING_INDEXGROUP_CONCATI.StatusId订单由I.TransactionId描述, “,”,1表示无符号=1 和SUMI.amount=0; 编辑:更仔细地看一下这个问题和,它概述了在GROUP BY、HAVING和ORDER BY子句中使用列别名是可能的,如果这些别名用倒钩引用,例如:

... 具有'StatusId`=1和'ReturnAmount`=0的
谢谢你指出,我熟悉WHERE和HAVING子句,但不熟悉表达式。在此之前,我一直在使用column的别名来创建子句,似乎对我很有用。这是一个缺陷吗?添加了反勾号,但不起作用。但是你发布的链接很棒。无论如何,我能够使HAVING子句工作,只需使别名与字段名不同即可。成功了。@KaeL,你用的MySQL版本是什么?@Pacerier:也许我用的是版本5。我不记得了,这是不到3年前的事了DI也有同样的困惑,然后意识到在前面的过程中,我声明了与having子句中的变量同名的变量。重命名前者解决了这个问题。