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

标签 mysql having-clause

我们刚刚对 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/

相关文章:

php - 插入网站帖子时mysql语法错误

mysql - 在 HAVING 子句中无法识别列 ALIAS,未知列错误

mysql - 我的sql Group By案例获得特定年份的最高薪员工

SQL 聚合具有相同 id 的行,第二列中具有特定值

MySQL 仅向具有不同值的表添加索引

mysql - 无法将tomcat容器连接到mysql容器

mysql - 在 vb.net 中将多个表中的列获取到 1 个 datagridview 中

python - 通过 Python 读取 MySQL 有时会导致警告 1292,似乎将秒解释为大于 60。

sql - 在SQLite中滥用聚合

sql - 统计SQL查询记录数