我有一个表user_comission_configuration_history
,我需要从user_id
中选择最后一个Comissions配置。
元组:
我尝试了很多查询,但结果是错误的。我的最后一个SQL:
SELECT *
FROM(
SELECT * FROM user_comission_configuration_history
ORDER BY on_date DESC
) AS ordered_history
WHERE user_id = 408002
GROUP BY comission_id
上述查询的结果是:
但是,正确的结果是:
id user_id comission_id value type on_date
24 408002 12 0,01 PERCENTUAL 2014-07-23 10:45:42
23 408002 4 0,03 CURRENCY 2014-07-23 10:45:41
21 408002 6 0,015 PERCENTUAL 2014-07-23 10:45:18
我的SQL出了什么问题?
答案 0 :(得分:3)
这是您的查询:
SELECT *
FROM (SELECT *
FROM user_comission_configuration_history
ORDER BY on_date DESC
) AS ordered_history
WHERE user_id = 408002
GROUP BY comission_id;
您的查询的一个主要问题是它使用MySQL 明确警告的group by
MySQL扩展。扩展名是使用select
中不在group by
或聚合函数中的其他列。警告(here)是:
MySQL扩展了GROUP BY的使用,以便选择列表可以引用 未在GROUP BY子句中命名的非聚合列。这意味着 前面的查询在MySQL中是合法的。您可以使用此功能 通过避免不必要的列排序来获得更好的性能 分组。但是,这主要适用于每个中的所有值 GROUP BY中未命名的非聚合列对于每个列都是相同的 组。服务器可以自由选择每个组中的任何值,所以 除非它们相同,否则所选值不确定。
因此,列中返回的值为 indeterminate 。
这是一种非常有效的方式来获得你想要的东西(“comission”拼写正确的英文):
SELECT *
FROM user_commission_configuration_history cch
WHERE NOT EXISTS (select 1
from user_commission_configuration_history cch2
where cch2.user_id = cch.user_id and
cch2.commission_id = cch.commission_id and
cch2.on_date > cch.on_date
) AND
cch.user_id = 408002;
答案 1 :(得分:1)
这是尝试做某事的一种方法。它获取每个user_ID和commissionID的最大日期,然后将其连接回基表,将结果限制为每个commissionID的最大日期。
SELECT *
FROM user_comission_configuration_history A
INNER JOIN (
SELECT User_ID, Comission_Id, max(on_Date) mOn_Date
FROM user_comission_configuration_history
Group by User-Id, Comission_Id
) B
on B.User_ID = A.User_Id
and B.Comission_Id = A.Comission_ID
and B.mOnDate=A.on_date
WHERE user_id = 408002
ORDER BY on_Date desc;