gpt4 book ai didi

mysql - 服务器更新后 HAVING 子句不起作用

转载 作者:行者123 更新时间:2023-11-29 12:25:15 25 4
gpt4 key购买 nike

我们刚刚对 mysql 版本从 5.0.51 进行了重大升级到 5.6.22,我刚刚注意到我的一个查询不再正常工作。

SELECT
p.id AS product_id,
p.code,
p.description,
p.unitofmeasure,
p.costprice,
p.packsize,
vc.rateinpercent,
CASE
WHEN Sum(sales.qty) IS NULL THEN 0
ELSE Sum(sales.qty)
END AS sold,
CASE
WHEN stock.stocklevel IS NULL THEN 0
ELSE stock.stocklevel
END AS stocklevel,
sum(sales.qty) - stock.stocklevel AS diff,
CEIL((sum(sales.qty) - stock.stocklevel) / p.packsize) AS amt
FROM products p
LEFT JOIN
( SELECT
col.product_id,
col.quantity AS qty
FROM customerorderlines col
LEFT JOIN customerorders co
ON co.id = col.customerorder_id
WHERE co.orderdate >= '2014-12-01 00:00:00'
AND co.orderdate <= '2015-02-09 23:59:59'
AND co.location_id IN (1,2,3,7)
) sales
ON sales.product_id = p.id
LEFT JOIN
( SELECT
product_id,
location_id,
Sum(stocklevel) AS stocklevel
FROM stock
WHERE location_id IN (1,2,3,7)
GROUP BY product_id
) stock
ON stock.product_id = p.id
LEFT JOIN vatcodes vc
ON vc.id = p.purchasevatcode_id
WHERE p.supplier_id IN (137)
AND p.currentstatus_v = 1
GROUP BY p.id
HAVING sold > stocklevel
ORDER BY sold DESC

在旧服务器上,HAVING 子句过滤掉所有带有减号的结果,结果如下:

Old Result

相反,我在新服务器上得到以下结果:

New Result

基本上,它会过滤掉一些负面结果,但不是全部。 (数据集是几天前的数据,这就是为什么“冷冻凝胶喷雾”数量、销售数量和库存数量略有不同)

事后看来是一件很棒的事情,但我没想到服务器更新之间的查询会有任何重大变化,所以我不想测试或检查任何东西。幸运的是,这是仅有的两三个使用 HAVING 的查询之一,所以如果我必须重写几个查询,那就这样吧。关于为什么会这样的任何想法吗?如果它根本不起作用,这很公平,但只是部分起作用?

预先感谢您的任何见解,

R

最佳答案

我想您已经尝试过对查询进行 EXPLAIN 来了解它在做什么?

尝试使计算的字段名称与基础字段名称不同,以便您可以确定要过滤的内容。当计算字段与基础物理字段具有相同名称时,我看到了一些奇怪的结果。

让子查询返回相同格式的结果(即求和/分组)有助于了解发生了什么。

我还没有测试过这个查询,但它可能会有所帮助。如果您发布表结构以及一些显示错误的虚假数据,这将有助于诊断

SELECT 
p.id AS product_id,
p.code,
p.description,
p.unitofmeasure,
p.costprice,
p.packsize,
vc.rateinpercent,
sales.totalSold,
stock.totalStock,
sales.totalSold - stock.totalStock AS diff,
CEIL((sales.totalSold - stock.totalStock) / p.packsize) AS amt
FROM products p
LEFT JOIN (
SELECT
col.product_id,
IFNULL( SUM(col.quantity), 0) AS totalSold
FROM customerorderlines col
LEFT JOIN customerorders co
ON co.id = col.customerorder_id
WHERE co.orderdate >= '2014-12-01 00:00:00'
AND co.orderdate <= '2015-02-09 23:59:59'
AND co.location_id IN (1,2,3,7)
GROUP BY product_id
) sales
ON sales.product_id = p.id
LEFT JOIN (
SELECT
product_id,
IFNULL( SUM(stocklevel), 0) AS totalStock
FROM stock
WHERE location_id IN (1,2,3,7)
GROUP BY product_id
) stock
ON stock.product_id = p.id
LEFT JOIN vatcodes vc
ON vc.id = p.purchasevatcode_id
WHERE p.supplier_id IN (137)
AND p.currentstatus_v = 1
GROUP BY p.id
HAVING totalSold > totalStock
ORDER BY totalSold DESC

关于mysql - 服务器更新后 HAVING 子句不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28430819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com