我有以下疑问:
select
products.id,
products.description,
products.barcode,
getStock(products.id, 'Production') AS total_stock
from `products`
having total_stock > 0
order by products.description asc
这非常简单。但是,返回的结果不正确。它当前返回 2 行,如果我删除
order by
子句,它将返回 4000 行。
select
products.id,
products.description,
products.barcode,
getStock(products.id, 'Production') AS total_stock
from `products`
having total_stock > 0
应用
group by
子句(如众多主题中提到的,例如 Error with ORDER BY using with HAVING Clause)没有成功,因为返回的行数再次为 2。
select
products.id,
products.description,
products.barcode,
getStock(products.id, 'Production') AS total_stock
from `products`
group by products.id, products.description, products.barcode
having total_stock > 0
order by products.description asc
我错过了什么?
编辑1:
getStock
函数
DELIMITER $$
CREATE FUNCTION getStock (productId INT, environment VARCHAR(255)) RETURNS INT(11)
BEGIN
DECLARE qty INT(11) DEFAULT 0;
SELECT SUM(pw.stock) INTO qty
FROM products_wholesalers AS pw
INNER JOIN subscriptions AS subscription ON subscription.id = pw.subscription_id
WHERE pw.product_id = productId
AND pw.active = true
AND subscription.type = 'Wholesaler'
AND subscription.active = true
AND subscription.environment = environment;
RETURN qty;
END $$
问题与 SQL 的处理方式有关,即“HAVING”和“ORDER BY”的组合。您的查询返回 4000 行,因为它没有按描述对结果进行排序,因此它返回满足 HAVING 条件的所有行。
在 SQL 中,HAVING 子句在 FROUP BY 子句完成分组后过滤结果,ORDER BY 子句在返回结果集之前对结果集中的行进行排序。
要解决,可以尝试使用子查询
SELECT * FROM (
SELECT
products.id,
products.description,
products.barcode,
getStock(products.id, 'Production') AS total_stock
FROM `products`
) AS subquery
WHERE total_stock > 0
ORDER BY description ASC;