/ / Як я можу використовувати стовпчик псевдоніма mysql у if операторі - php, mysql, псевдонімі

Як я можу використовувати стовпець псевдонімів mysql у операторі if - php, mysql, alias

Невідомий стовпець "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
));

Відповіді:

0 для відповіді № 1

Це твоє 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

Як показує помилка, ви не можете повторно використовувати псевдонім стовпця в тому ж самому SELECT заява, де вона визначена. Це стосується не лише SELECT, а також для інших компонентів запиту, таких як WHERE.

Отже, повторіть логіку, і я віддаю перевагу 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

0 для відповіді № 2

Ви можете використовувати змінні сесії MySQL, які виконують вашу роботу, не повторюючи логіку.

Ось як це зробити в запиті:

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;

У цьому запиті я використовував змінну @temp_stock_level для збереження значення CURRENT_STOCK_LEVEL