我有一个价格表,包含我的产品的所有价格。 一个产品可以有不同的价格取决于:国家,客户组,货币,日期间隔...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
谢谢。
如果您已经拥有MAX – Kasnady
,您将不再需要GROUP_BY您好@AKZhang。如果我删除GROUP BY,我会得到相同的结果。 – anardil
问题是,你需要写所有的列名.. – Kasnady