MySQL - 如何通过Select从组中获取模式

时间:2013-02-19 03:50:14

标签: mysql magento

我创建了一堆将产品导入magento的MySQL脚本,我使用GROUP BY将产品分组为可配置产品

在过去,我使用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()函数,这里是我正在使用的查询示例< / p>

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()部分

2 个答案:

答案 0 :(得分: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;

这将返回Price 模式值,然后您可以在SELECT语句中使用此值,如下所示,您可以插入模式值,请参阅下文查询:

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

答案 1 :(得分:1)

这可能有点棘手,因为MODE可以有多个价格 - 如果2个价格具有相同的数量,那么它们都被认为是MODE。

此查询应返回org_data_table中任何价格在MODE中的记录:

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)

在查询之前插入记录。

希望这有帮助。