Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL GROUP BY和ORDER BY的结果错误_Mysql_Sql_Database_Relational Database - Fatal编程技术网

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的不确定性质,这一点是完全正确的。现在对我来说,根本原因已经确定了。谢谢@梅肯。现在,答案应该在两方面都是正确的。