mysql - MySQL:ORDER BY 和 GROUP BY 在一起
问题描述
我最近升级到 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
解决方案
同意GL,
从组中选择 *
是不可预测的。
我将重写查询:
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;
推荐阅读
- r - 在 R 中使用 lapply 将多个数据表传递给函数的方法
- python - Python - 从文本文件到字典的邻接列表
- ruby-on-rails - 使用 CarrierWave 上传多个文件作为数据库中的单个记录
- kotlin - Spring Cloud Stream Kotlin 消费者问题
- javascript - createReactionCollector 在 discord.js 中不起作用
- c# - 没有参数的构造函数,带有两个“新”关键字
- c# - Azure Durable Function:检测到多线程执行(使用默认示例代码)
- javascript - Three.js 将旋转添加到围绕枢轴的组
- c - 使用 void 指针更改结构的值
- android - 为 Android 编译 Swift