繁体   English   中英

MySQL:ORDER BY和GROUP BY一起

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM