MySQL GROUP BY和ORDER BY的结果错误
我有一个表MySQL GROUP BY和ORDER BY的结果错误,mysql,sql,database,relational-database,Mysql,Sql,Database,Relational Database,我有一个表user\u commission\u configuration\u history,我需要从user\u id中选择上一个commissions配置 元组: 我尝试了很多查询,但是结果是错误的。我的最后一个SQL: SELECT * FROM( SELECT * FROM user_comission_configuration_history ORDER BY on_date DESC ) AS ordered_history W
user\u commission\u configuration\u history
,我需要从user\u id
中选择上一个commissions配置
元组:
我尝试了很多查询,但是结果是错误的。我的最后一个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有什么问题?这是您的查询:
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明确警告不要使用的groupby
的MySQL扩展。扩展是使用select
中不在groupby
或聚合函数中的其他列。警告()是:
MySQL扩展了GROUPBY的使用,以便选择列表可以引用
GROUP BY子句中未命名的未聚合列。这意味着
前面的查询在MySQL中是合法的。您可以使用此功能
通过避免不必要的列排序和
分组。但是,这主要是在每个
未在GROUP BY中命名的未聚合列对于每个列都是相同的
小组。服务器可以从每个组中自由选择任何值,因此
除非它们相同,否则选择的值是不确定的
因此,列中返回的值是不确定的
这里有一个非常有效的方法来获得你想要的(用英语正确拼写“commission”):
这是您的查询:
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明确警告不要使用的groupby
的MySQL扩展。扩展是使用select
中不在groupby
或聚合函数中的其他列。警告()是:
MySQL扩展了GROUPBY的使用,以便选择列表可以引用
GROUP BY子句中未命名的未聚合列。这意味着
前面的查询在MySQL中是合法的。您可以使用此功能
通过避免不必要的列排序和
分组。但是,这主要是在每个
未在GROUP BY中命名的未聚合列对于每个列都是相同的
小组。服务器可以从每个组中自由选择任何值,因此
除非它们相同,否则选择的值是不确定的
因此,列中返回的值是不确定的
这里有一个非常有效的方法来获得你想要的(用英语正确拼写“commission”):
这里有一个方法来做你想做的事。它获取每个用户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;
这里有一个方法来做你想做的事。它获取每个用户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;
可能重复的是,比尔·卡温的回答是正确的,表现更好。关于重复建议。可能重复的是,Bill Karwin的回答是正确的,表现更好。关于重复的建议,戈登·林诺夫,回答得很好。但结果仍然是错误的。并将cch.user_id上的第二个WHERE更改为和。您的SQL返回2个元组,用户的正确元组数为3。我认为使用2个元组而不是3个元组的原因是由于cch2.type上的联接。我想如果能达到预期的效果,应该是在委员会会议上。然而,您的问题的根本原因是扩展group by的不确定性质,这一点是完全正确的。现在对我来说,根本原因已经确定了。谢谢@梅肯。答案现在应该在两个方面都是正确的。戈登·林诺夫,一个非常好的回答。但结果仍然是错误的。并将cch.user_id上的第二个WHERE更改为和。您的SQL返回2个元组,用户的正确元组数为3。我认为使用2个元组而不是3个元组的原因是由于cch2.type上的联接。我想如果能达到预期的效果,应该是在委员会会议上。然而,您的问题的根本原因是扩展group by的不确定性质,这一点是完全正确的。现在对我来说,根本原因已经确定了。谢谢@梅肯。现在,答案应该在两方面都是正确的。