我最近升级到MySQL 5.7.22,并且查询停止工作。我有两个表“ items”和“ packages”,在这里我试图为每个项目输出一行,其中包括一列具有最低单位价格的包装,但忽略了将单位价格设置为0的包装。 / p>
这里是表和数据的最小样本:
CREATE TABLE `items` (
`id` int(11) NOT NULL
);
CREATE TABLE `packages` (
`item_id` int(11) NOT NULL,
`price_per_unit` float(16,6) DEFAULT 0
);
INSERT INTO `items` (`id`) VALUES
(1),
(2),
(3);
INSERT INTO `packages` (`item_id`, `price_per_unit`) VALUES
(1, 0.45),
(1, 0),
(1, 0.56),
(1, 0.34);
以下是查询:
SELECT
*
FROM
(
SELECT
items.id,
NULLIF(pkgs.ppu, 0) AS mppu
FROM
items
LEFT JOIN
(
SELECT
item_id,
price_per_unit AS ppu
FROM
packages
) AS pkgs ON pkgs.item_id = items.id
ORDER BY
IFNULL(mppu, 9999)
) X
GROUP BY
X.id
我将零值设置为null,然后在订购期间将其值提高了很多。必须有一个更好的方法(特别是因为此方法不再起作用)。
此数据的预期输出为:
id mppu
1 0.34
2 null
3 null
答案 0 :(得分:0)
我认为您的查询有点太复杂了。那怎么办?
SELECT i.id,IFNULL(Min(p.price_per_unit), 'NONE')
FROM items i
LEFT JOIN packages p
ON ( i.id = p.item_id )
WHERE p.price_per_unit > 0
OR p.price_per_unit IS NULL
GROUP BY i.id
请参阅此fiddle。我使用了这些数据:
INSERT INTO `items` (`id`) VALUES
(1),(2),(3);
INSERT INTO `packages` (`item_id`, `price_per_unit`) VALUES
(1, 0.45),
(1, 0),
(1, 0.56),
(1, 0.34),
(2, 9.45),
(2, 0),
(2, 0.56),
(2, 0.14);
并得到以下结果:
id IFNULL(min(p.price_per_unit),'None')
1 0.340000
2 0.140000
3 None
答案 1 :(得分:0)
同意GL,
选择*来自GROUP BY
不可预测。
我将使用重写查询:
SELECT a.*,b.min_price_per_unit
FROM items a
LEFT JOIN (
SELECT item_id
,min(CASE
WHEN price_per_unit = 0
THEN 9999
ELSE price_per_unit
END) AS min_price_per_unit
FROM packages
GROUP BY item_id
) b ON a.id = b.item_id;