简体   繁体   English

我如何在if语句中使用mysql别名列

[英]How can i use mysql alias column in if statement

Unknown column 'CURRENT_STOCK_LEVEL' in 'field list' “字段列表”中的未知列“ CURRENT_STOCK_LEVEL”

$queryString = 'SELECT A.ITEM_CODE, A.BEGINNING_BALANCE AS BEGINNING_BALANCE, B.DELIVERY AS DELIVERY, C.ISSUANCE AS ISSUANCE, 
(IFNULL(BEGINNING_BALANCE, 0) + IFNULL(DELIVERY, 0)) - IFNULL(ISSUANCE, 0) AS CURRENT_STOCK_LEVEL , A.REORDERPNT AS REORDERPNT,

IF( CURRENT_STOCK_LEVEL <= REORDERPNT, "LOW", "HIGH") AS STATUS

FROM MM_NEW_ROP_ITEMS AS A
LEFT OUTER JOIN (SELECT ITEM_CODE, SUM(QUANTITY) AS ISSUANCE FROM MM_NEW_ROP_ISSUANCES GROUP BY ITEM_CODE) AS C ON A.ITEM_CODE = C.ITEM_CODE
LEFT OUTER JOIN (SELECT ITEM_CODE, SUM(QUANTITY) AS DELIVERY FROM MM_NEW_ROP_DELIVERIES GROUP BY ITEM_CODE) AS B ON A.ITEM_CODE = B.ITEM_CODE
ORDER BY A.ITEM_CODE'; 

$query = mysql_query($queryString) or die(mysql_error());

//makes a loop and creates an array with query fields

$items = array();
while($item = mysql_fetch_assoc($query)) {
    $items[] = $item;
}

//encodes for JSON format
echo json_encode(array(
    "success" => mysql_errno() == 0,
    "items" => $items
));

This is your SELECT : 这是您的SELECT

SELECT A.ITEM_CODE, A.BEGINNING_BALANCE, B.DELIVERY AS DELIVERY, C.ISSUANCE, 
       (IFNULL(BEGINNING_BALANCE, 0) + IFNULL(DELIVERY, 0)) - IFNULL(ISSUANCE, 0) AS CURRENT_STOCK_LEVEL ,
       A.REORDERPNT AS REORDERPNT,
       IF(CURRENT_STOCK_LEVEL <= REORDERPNT, 'LOW', 'HIGH') AS STATUS

As the error suggests, you cannot re-use a column alias in the same SELECT statement where it is defined. 如错误所提示,您不能在定义它的同一SELECT语句中重复使用列别名。 This applies not only to the SELECT , but also to other components of the query such as WHERE . 这不仅适用于SELECT ,而且适用于查询的其他组件,例如WHERE

So, repeat the logic, and I prefer COALESCE() and CASE (this is the ANSI standard function): 因此,重复一下逻辑,我更喜欢COALESCE()CASE (这是ANSI标准函数):

SELECT A.ITEM_CODE, A.BEGINNING_BALANCE, B.DELIVERY AS DELIVERY, C.ISSUANCE, 
       (COALESCE(BEGINNING_BALANCE, 0) + COALESCE(DELIVERY, 0)) - COALESCE(ISSUANCE, 0)) AS CURRENT_STOCK_LEVEL ,
       A.REORDERPNT AS REORDERPNT,
       (CASE WHEN COALESCE(BEGINNING_BALANCE, 0) + COALESCE(DELIVERY, 0)) - 
                  COALESCE(ISSUANCE, 0) <= REORDERPNT
             THEN 'LOW' ELSE 'HIGH'
        END) AS STATUS

You can use MySQL session variables which do your job without repeating the logic. 您可以使用MySQL会话变量来完成您的工作,而无需重复逻辑。

Here is the way to do that in query: 这是在查询中执行此操作的方法:

SELECT A.ITEM_CODE, A.BEGINNING_BALANCE AS BEGINNING_BALANCE, B.DELIVERY AS DELIVERY, C.ISSUANCE AS ISSUANCE, 
    @temp_stock_level:=0, @temp_stock_level:=(IFNULL(BEGINNING_BALANCE, 0) + IFNULL(DELIVERY, 0)) - IFNULL(ISSUANCE, 0) AS CURRENT_STOCK_LEVEL , 
    A.REORDERPNT AS REORDERPNT,IF( @temp_stock_level <= REORDERPNT, "LOW", "HIGH") AS STATUS
    FROM MM_NEW_ROP_ITEMS AS A
    LEFT OUTER JOIN (SELECT ITEM_CODE, SUM(QUANTITY) AS ISSUANCE FROM MM_NEW_ROP_ISSUANCES GROUP BY ITEM_CODE) AS C ON A.ITEM_CODE = C.ITEM_CODE
    LEFT OUTER JOIN (SELECT ITEM_CODE, SUM(QUANTITY) AS DELIVERY FROM MM_NEW_ROP_DELIVERIES GROUP BY ITEM_CODE) AS B ON A.ITEM_CODE = B.ITEM_CODE
    ORDER BY A.ITEM_CODE;

In this query I have used @temp_stock_level variable to store value CURRENT_STOCK_LEVEL 在此查询中,我使用了@temp_stock_level变量来存储值CURRENT_STOCK_LEVEL

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM