MySQL Have + OrderBy 返回的行数少于预期

问题描述 投票:0回答:1

我有以下疑问:

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 mysql
1个回答
0
投票

问题与 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;
© www.soinside.com 2019 - 2024. All rights reserved.