[英]MySQL: ORDER BY and GROUP BY together
我最近升级到MySQL 5.7.22,但查询停止工作。 我有两个表“ items”和“ packages”,在这里我试图为每个项目输出一行,其中包括一列具有最低单位价格的包装,但是忽略了将单位价格设置为0的包装。
这是表和数据的最小样本:
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
我认为您的查询有点太复杂了。 那这个呢?
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
看到这个小提琴 。 我使用了以下数据:
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
同意GL ,
选择* FROM 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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.