使用GROUP BY和ORDER BY,MySQL结果错误

时间:2014-07-23 14:30:14

标签: mysql sql database relational-database

我有一个表user_comission_configuration_history,我需要从user_id中选择最后一个Comissions配置。

元组:

enter image description here

我尝试了很多查询,但结果是错误的。我的最后一个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

上述查询的结果是:

enter image description here

但是,正确的结果是:

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出了什么问题?

2 个答案:

答案 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;