2015-02-10 2 views
0

Мы только что сделали крупное обновление в версии mysql от 5.0.51 до 5.6.22, и я только что заметил, что один из моих запросов больше не работает должным образом. Предложение HAVING не работает после обновления сервера

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

В основном, это отфильтровывать некоторые отрицательных результатов, но не все из них. (Наборы данных несколько дней назад, поэтому «Колпак« Freeze Gel Spray »и проданные и биржевые номера немного отличаются)

Оглядываясь назад, это замечательная вещь, но я не ожидал от нее каких-либо серьезных изменений запросов между обновлениями сервера, поэтому я не хотел проверять или проверять что-либо. К счастью, это один из двух или трех запросов, которые используют HAVING, поэтому, если мне придется перезаписать пару запросов, пусть будет так. Любые идеи относительно того, почему это правда? Если бы он не работал вообще, справедливо, но только частично работал?

Заранее спасибо за любой проницательности,

R

ответ

1

Я понимаю, что вы уже пробовали 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 
Смежные вопросы