首页 > 解决方案 > 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

标签: mysql

解决方案


同意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;

推荐阅读