0

商品データ フィードの操作に取り組んでおり、現在、関連商品のグループ化に取り組んでいます。欲しいものはほとんど手に入ったけど、凡庸なレーシング ドライバーのように、最も必要なときにスキルが不足しています。

私の問題を説明するために、簡略化されたバージョンを作成しました。データ構造は次のとおりです。

CREATE TABLE `feed` (
    `sku` VARCHAR(10),
    `price` DECIMAL(6,2),
    `groupkey` VARCHAR(10)
  );

INSERT INTO `feed` (`sku`, `price`, `groupkey`) VALUES
('AAA', 10.00, NULL),
('BBB', 10.00, 'group1'),
('CCC', 12.00, 'group1'),
('DDD', 10.00, 'group2'),
('EEE', 12.00, 'group2'),
('FFF', 14.00, 'group2'),
('GGG', 20.00, NULL);

私の現在のクエリは次のとおりです。

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;

クエリは次の行を返します。

+----------+-------------+-------------------+--------+
| 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、連結された各 から減算するpriceことで、絶対価格ではなく、各 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 |
+----------+-------------+-------------------+--------+

私は一般的にこのフィードに多くの時間を費やしてきましたが、おそらく統合の最後のハードルであることに本当に行き詰まっています. 正しい方向に進むためのガイダンスをいただければ幸いです。

編集: このクエリの結果を「仮想」製品行として使用して、グループ内の製品の親として機能します。

4

1 に答える 1

3

group_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

問題は 。. . どのフィード.価格? 元のクエリで返される値は、グループ内の行の 1 つからの任意の値です。最小以上の差が必要かもしれないと考えて、その値を使用しました。

クエリを作成する最良の方法は次のとおりだと思います。

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

非表示の列 および の順序を想定することはできませんgroup_concat()。この点について、ドキュメントは非常に明確です。

MySQL は GROUP BY の使用を拡張して、選択リストが GROUP BY 句で指定されていない非集計列を参照できるようにします。これは、前述のクエリが MySQL で有効であることを意味します。この機能を使用すると、不要な列の並べ替えやグループ化を回避してパフォーマンスを向上させることができます。ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。さらに、各グループからの値の選択は、ORDER BY 句を追加しても影響を受けません。結果セットのソートは値が選択された後に行われ、ORDER BY はサーバーが選択する値には影響しません。

特定の順序で処理したい場合は、構造が適切にクエリされていることを確認する必要があります。とは言っても、実際にはうまくいくことが多いですが、保証はありません。

于 2013-03-05T19:00:47.187 に答える