MySQL:将ORDER BY和GROUP BY一起使用

时间:2018-06-26 02:18:30

标签: mysql

我最近升级到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

2 个答案:

答案 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;