参考价格,并在MySQL中进行分组讨论时从另一个价格中减去

参考价格,并在MySQL中进行分组讨论时从另一个价格中减去,mysql,sql,e-commerce,group-concat,data-manipulation,Mysql,Sql,E Commerce,Group Concat,Data Manipulation,我正在处理一个产品数据提要,目前正在对相关产品进行分组。我几乎在我想要的地方得到了东西,但是,就像一个平庸的赛车手一样,我在最需要的时候就已经耗尽了技能 为了说明我的问题,我创建了一个简化版本。以下是数据结构: 创建表“提要”( `sku`VARCHAR(10), `价格`十进制(6,2), `groupkey`VARCHAR(10) ); 在“提要”(`sku`、`price`、`groupkey`)值中插入 ('AAA',10.00,空), ('BBB',10.00,'group1'), (

我正在处理一个产品数据提要,目前正在对相关产品进行分组。我几乎在我想要的地方得到了东西,但是,就像一个平庸的赛车手一样,我在最需要的时候就已经耗尽了技能

为了说明我的问题,我创建了一个简化版本。以下是数据结构:

创建表“提要”(
`sku`VARCHAR(10),
`价格`十进制(6,2),
`groupkey`VARCHAR(10)
);
在“提要”(`sku`、`price`、`groupkey`)值中插入
('AAA',10.00,空),
('BBB',10.00,'group1'),
('CCC',12.00,'group1'),
('DDD',10.00,'group2'),
('EEE',12.00,'group2'),
('FFF',14.00,'group2'),
('GGG',20.00,空);
我目前的查询是:

SELECT feed.groupkey
    , group_concat(feed.sku) AS skus
    , group_concat(feed.price) AS prices
    , feed.price AS pprice
FROM
    feed
WHERE
    feed.groupkey IS NOT NULL
GROUP BY
    feed.groupkey;
SELECT feed.groupkey, group_concat(feed.sku) AS skus,
       group_concat(feed.price - fsum.minprice) AS prices
       min(feed.price) AS pprice
FROM feed left outer join
     (select groupkey, MIN(feed.price) as minprice
      from feed
      group by groupkey
     ) fsum
     on feed.groupkey = fsum.groupkey
WHERE feed.groupkey IS NOT NULL
GROUP BY feed.groupkey
查询返回以下行:

+----------+-------------+-------------------+--------+
| groupkey | skus        | prices            | pprice |
+----------+-------------+-------------------+--------+
| group1   | BBB,CCC     | 10.00,12.00       |  10.00 |
| group2   | DDD,EEE,FFF | 10.00,12.00,14.00 |  10.00 |
+----------+-------------+-------------------+--------+
我实际上需要做的是从每个串联的
价格
中减去
pprice
,得到每个sku之间的价格差,而不是它们的绝对价格。这将返回梦想的结果:

+----------+-------------+-------------------+--------+
| groupkey | skus        | prices            | pprice |
+----------+-------------+-------------------+--------+
| group1   | BBB,CCC     | 0.00,2.00         |  10.00 |
| group2   | DDD,EEE,FFF | 0.00,2.00,4.00    |  10.00 |
+----------+-------------+-------------------+--------+
总的来说,我在这个提要上花了很多时间,我真的很难理解集成中的最后一个障碍是什么。我真的很感激能给我一些指导,帮助我朝着正确的方向前进


编辑:我使用此查询的结果作为“虚拟”产品行,作为组中产品的父级。

您可以在
组中执行减法。\u concat()
,例如:

SELECT feed.groupkey, group_concat(feed.sku) AS skus,
       group_concat(feed.price - min(feed.price)) AS prices
       min(feed.price) AS pprice
FROM feed
WHERE feed.groupkey IS NOT NULL
GROUP BY feed.groupkey
问题是。哪种饲料价格?原始查询中返回的值是组中某一行的任意值。考虑到您可能希望差值超过最小值,我使用了该值

我认为编写查询的最佳方式是:

SELECT feed.groupkey
    , group_concat(feed.sku) AS skus
    , group_concat(feed.price) AS prices
    , feed.price AS pprice
FROM
    feed
WHERE
    feed.groupkey IS NOT NULL
GROUP BY
    feed.groupkey;
SELECT feed.groupkey, group_concat(feed.sku) AS skus,
       group_concat(feed.price - fsum.minprice) AS prices
       min(feed.price) AS pprice
FROM feed left outer join
     (select groupkey, MIN(feed.price) as minprice
      from feed
      group by groupkey
     ) fsum
     on feed.groupkey = fsum.groupkey
WHERE feed.groupkey IS NOT NULL
GROUP BY feed.groupkey
您不能假定隐藏列和
组的顺序。\u concat()
。在这一点上,双方的立场相当明确:

MySQL扩展了GROUPBY的使用,以便选择列表可以引用 GROUP BY子句中未命名的未聚合列。这意味着 前面的查询在MySQL中是合法的。您可以使用此功能 通过避免不必要的列排序和 分组。但是,这主要是在每个 未在GROUP BY中命名的未聚合列对于每个列都是相同的 小组。服务器可以从每个组中自由选择任何值,因此 除非它们相同,否则选择的值是不确定的。 此外,不能从每个组中选择值 受添加ORDER by子句的影响。结果集的排序 在选择值后发生,并且“排序依据”不影响 服务器选择的值


如果您希望事情按特定顺序进行,那么需要确保正确查询结构。也就是说,它通常在实践中有效,但没有保证。

您可以在
组中执行减法,例如:

SELECT feed.groupkey, group_concat(feed.sku) AS skus,
       group_concat(feed.price - min(feed.price)) AS prices
       min(feed.price) AS pprice
FROM feed
WHERE feed.groupkey IS NOT NULL
GROUP BY feed.groupkey
问题是。哪种饲料价格?原始查询中返回的值是组中某一行的任意值。考虑到您可能希望差值超过最小值,我使用了该值

我认为编写查询的最佳方式是:

SELECT feed.groupkey
    , group_concat(feed.sku) AS skus
    , group_concat(feed.price) AS prices
    , feed.price AS pprice
FROM
    feed
WHERE
    feed.groupkey IS NOT NULL
GROUP BY
    feed.groupkey;
SELECT feed.groupkey, group_concat(feed.sku) AS skus,
       group_concat(feed.price - fsum.minprice) AS prices
       min(feed.price) AS pprice
FROM feed left outer join
     (select groupkey, MIN(feed.price) as minprice
      from feed
      group by groupkey
     ) fsum
     on feed.groupkey = fsum.groupkey
WHERE feed.groupkey IS NOT NULL
GROUP BY feed.groupkey
您不能假定隐藏列和
组的顺序。\u concat()
。在这一点上,双方的立场相当明确:

MySQL扩展了GROUPBY的使用,以便选择列表可以引用 GROUP BY子句中未命名的未聚合列。这意味着 前面的查询在MySQL中是合法的。您可以使用此功能 通过避免不必要的列排序和 分组。但是,这主要是在每个 未在GROUP BY中命名的未聚合列对于每个列都是相同的 小组。服务器可以从每个组中自由选择任何值,因此 除非它们相同,否则选择的值是不确定的。 此外,不能从每个组中选择值 受添加ORDER by子句的影响。结果集的排序 在选择值后发生,并且“排序依据”不影响 服务器选择的值


如果您希望事情按特定顺序进行,那么需要确保正确查询结构。这就是说,它通常在实践中起作用,但没有保证。

在应用
组\u-CONCAT
之前进行减法(或者在
组\u-CONCAT()内部)
在应用
组\u-CONCAT
之前进行减法(或者在
组\u-CONCAT()内部)
我使用这个查询的结果作为“虚拟的”产品行,用作组中产品的父级。在此阶段之前,数据已按价格顺序排列,因此我可以放心地假设,
组中的第一个结果也具有最低的
价格
。我感谢您扩展您的答案,我可能会遇到下一个订购问题,我也是grat非常感谢你考虑到这一点。我目前正试图让你的建议为我工作(“无效使用组功能”)-我将继续推动它,并在它运行后报告。再次感谢,我的帖子中的示例非常有用。当我将其应用于更广泛的提要时,会出现订购问题-
prices
列中的一些值显示为负数。我将尝试以此作为起点。当我有能力给出时,+1。这最终成为解决方案的一个主要部分,并且几乎完全按照建议使用。非常感谢您的帮助。我将此查询的结果作为“虚拟”使用产品行,用作组中产品的父级。在此阶段之前,数据已按价格顺序排列,因此我可以放心地假设,
组中的第一个结果也具有最低的
价格
。我感谢您扩展您的答案,我可能会遇到下一个订购问题,我也是grat谢谢你把它考虑进去