2017-03-06 42 views
0

我有一个价格表,包含我的产品的所有价格。 一个产品可以有不同的价格取决于:国家,客户组,货币,日期间隔...Mysql - 不能从别名值中获取最大值的正确行

在这里我的表“commerce_product_price_index”与一个例子:1产品与2价格。

+----+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+ 
| id | product_id | customer_group_id | currency_id | country_id | geozone_id | user_id | time_from | time_to | price | 
+----+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+ 
| 1 | 1   | 0     | 0   | 0   | 0   | 0  | 1488632584 | 1646348400 | 500 | 
| 2 | 1   | 0     | 3   | 19   | 7   | 0  | 1488632584 | 1646348400 | 700 | 
+----+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+ 

对于每个行我计算“得分”的决定:在COUNTRY_ID,geozone_id,USER_ID,currency_id ....采取这些值当客户登录,所以不要介意在此之前。我的要求来计算分数(我不把WHERE条件,简化的例子)的

例子:

SELECT `cppi`.*, 
IF (1488788495 >= `time_from` AND 1488788495 <= `time_to`, 1, 0) + 
IF (`customer_group_id` = 2, 2, 0) + IF (`geozone_id` = 7, 4, 0) + 
IF (`country_id` = 19, 8, 0) + IF (`currency_id` = 3, 16, 0)+ 
IF (`user_id` = 0, 32, 0) AS score 
FROM `commerce_product_price_index` AS `cppi` 

所以现在我有一个新的领域在我的结果=>“分数”。

+----+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+----------+ 
| id | product_id | customer_group_id | currency_id | country_id | geozone_id | user_id | time_from | time_to | price | score | 
+----+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+----------+ 
| 1 | 1   | 0     | 0   | 0   | 0   | 0  | 1488632584 | 1646348400 | 500 | 33  | 
| 2 | 1   | 0     | 3   | 19   | 7   | 0  | 1488632584 | 1646348400 | 700 | 61  | 
+----+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+----------+ 

第一行具有得分=> 33

第二行有一个得分=> 61

所以我从这个请求决定与最大得分得到的行。

SELECT `ccpi_max_score`.*, MAX(score) AS max_score 
FROM (
    SELECT `cppi`.*, 
    IF (1488788495 >= `time_from` AND 1488788495 <= `time_to`, 1, 0) + 
    IF (`customer_group_id` = 2, 2, 0) + 
    IF (`geozone_id` = 7, 4, 0) + 
    IF (`country_id` = 19, 8, 0) + 
    IF (`currency_id` = 3, 16, 0)+ 
    IF (`user_id` = 0, 32, 0) AS score 
    FROM `commerce_product_price_index` AS `cppi` 
) AS ccpi_max_score 
GROUP BY product_id 

这里的结果是:它返回一行但价格错误。我得到的价格是“500”,而不是价格为“700”的那一排。

+----+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+----------+-----------------+ 
| id | product_id | customer_group_id | currency_id | country_id | geozone_id | user_id | time_from | time_to | price | score | max_score  | 
+----+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+----------+-----------------+ 
| 1 | 1   | 0     | 0   | 0   | 0   | 0  | 1488632584 | 1646348400 | 500 | 33  | 61    | 
+----+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+----------+-----------------+ 

我认为这是GROUP BY的问题。但我是SQL新手,我不知道我的错在哪里。

我创建了一个小提琴=>http://sqlfiddle.com/#!9/5a25f9/4/0

谢谢。

+0

如果您已经拥有MAX – Kasnady

+0

,您将不再需要GROUP_BY您好@AKZhang。如果我删除GROUP BY,我会得到相同的结果。 – anardil

+0

问题是,你需要写所有的列名.. – Kasnady

回答

0

我找到了我的解决方案。

SELECT 
    * 
FROM 
commerce_product_price_index P 
    INNER JOIN (
     SELECT 
      product_id, 
      MAX(
       IF (1488788495 >= `time_from` AND 1488788495 <= `time_to`, 1, 0) + 
       IF (`customer_group_id` = 2, 2, 0) + 
       IF (`geozone_id` = 7, 4, 0) + 
       IF (`country_id` = 19, 8, 0) + 
       IF (`currency_id` = 3, 16, 0)+ 
       IF (`user_id` = 0, 32, 0) 
      ) AS score 
     FROM commerce_product_price_index 
     GROUP BY product_id 
    ) SM 
    ON P.product_id = SM.product_id 
    AND (
     IF (1488788495 >= P.`time_from` AND 1488788495 <= P.`time_to`, 1, 0) + 
     IF (P.`customer_group_id` = 2, 2, 0) + 
     IF (P.`geozone_id` = 7, 4, 0) + 
     IF (P.`country_id` = 19, 8, 0) + 
     IF (P.`currency_id` = 3, 16, 0)+ 
     IF (P.`user_id` = 0, 32, 0) 
    ) = SM.score 
0
SELECT product_id,customer_group_id,currency_id,country_id,geozone_id,user_id,time_from, time_to,price,max(score) as max_score 
FROM (
    SELECT `cppi`.*, 
    IF (1488788495 >= `time_from` AND 1488788495 <= `time_to`, 1, 0) + 
    IF (`customer_group_id` = 2, 2, 0) + 
    IF (`geozone_id` = 7, 4, 0) + 
    IF (`country_id` = 19, 8, 0) + 
    IF (`currency_id` = 3, 16, 0)+ 
    IF (`user_id` = 0, 32, 0) AS score 
    FROM `commerce_product_price_index` AS `cppi` 
) AS ccpi_max_score 
GROUP BY product_id 

你需要重写所有列,并不能使用.*除了max是一些unique_id它可以是加入到表

+0

同样的结果我得到了与错误的价格行。也许我必须再次做一个再评论。 – anardil

+0

你能告诉我这个查询的结果吗? – Kasnady

+0

当我看到你的追求。您的查询选择max已经正确。只是与数据相关的数据最大是错误的 – Kasnady

0

@AKZhang这里的结果为您的解决方案。

+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+------------+ 
| product_id | customer_group_id | currency_id | country_id | geozone_id | user_id | time_from | time_to | price | max_score | 
+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+------------+ 
| 1   | 0     | 0   | 0   | 0   | 0  | 1488632584 | 1646348400 | 500 | 61   | 
+------------+-------------------+-------------+------------+------------+---------+------------+------------+-------+------------+