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子句中的变量同名的变量。重命名前者解决了这个问题。