0

製品をmagentoにインポートする一連のMySQLスクリプトを作成しました。GROUPBYを使用して、製品を構成可能な製品にグループ化しました。

以前はMIN()、グループ内で最低価格を取得し、その値を構成可能な製品の価格として使用していましたが、最近では、このようなケースがいくつかあります。

Simple Product ID | Price ($)
------------------------------
      1001        |   10
      1002        |   10
      1003        |    5
      1004        |   10
      1005        |   20
      1006        |   10

この状況では、構成可能な製品を作成するMIN(Price)と5が返されますが、構成可能な製品ではマイナスの違いが生じる可能性があることを知りました。つまり、コードを変更する必要があるため、最小値(5)を取得する代わりにモードを取得します。 (10)

クエリのをMODE()に置き換えるだけでよいと思いましたMIN()が、MySQLのMODE()関数がないようです。これが、使用しているクエリの例です。

INSERT INTO import_table
(
    product_id, stock_id, price
)
SELECT ODT.product_id, ODT.stock_id, MIN(ODT.Price)
FROM org_data_table AS ODT
GROUP BY ODT.stock_id

モードを取得するためにすでに存在する関数はありますか?そうでない場合は、それを取得するために何をする必要がありますかMIN()、クエリの一部を変更したいだけです

4

2 に答える 2

1

以下のクエリで価格の最頻値を取得できます

SELECT ODT.Price as price, count(ODT.Price) AS cnt 
FROM org_data_table  as ODT
GROUP BY ODT.price 
ORDER BY cnt DESC 
LIMIT 1;

これによりMode値が返さPrice 、次のようにSELECTステートメントでこれを利用できるため、Mode値を挿入できます。以下のクエリを参照してください。

INSERT INTO import_table
(
    product_id, stock_id, price
)
SELECT ODT.product_id, ODT.stock_id, (SELECT ODT.Price as price 
FROM org_data_table  as ODT
GROUP BY ODT.price 
ORDER BY count(ODT.Price) DESC 
LIMIT 1) as price
FROM org_data_table AS ODT
GROUP BY ODT.stock_id
于 2013-02-19T04:01:11.300 に答える
1

MODEには複数の価格が設定される可能性があるため、これは少し注意が必要です。2つの価格のカウントが同じである場合、両方ともMODEと見なされます。

このクエリは、価格がMODEにあるorg_data_tableからすべてのレコードを返す必要があります。

SELECT DISTINCT T.Product_Id, T.Stock_Id, T.Price
FROM org_data_table T 
  JOIN (
    SELECT COUNT(*) cnt, Price
    FROM org_data_table
    GROUP BY Price
    HAVING COUNT(*) = (
      SELECT Max(cnt)  
      FROM (
        SELECT COUNT(*) cnt, Price
        FROM org_data_table
        GROUP BY Price
        ) t
      )
  ) T2 ON T.Price = T2.Price

そしてここにいくつかのサンプルフィドルがあります:http ://sqlfiddle.com/#!2 / 8f1a2 / 1

明らかに、次を追加できます。

INSERT INTO import_table (product_id, stock_id, price)

レコードを挿入するクエリの前。

お役に立てれば。

于 2013-02-19T04:20:01.013 に答える