了解mysql中的相关性

时间:2016-04-19 21:07:27

标签: mysql sql

我有一张表格,其中包含代表已下订单的人的重复IDs。这些订单中的每一个都有一个日期。每个订单的状态代码为1 - 4. 4表示已取消的订单。我使用以下查询:

SELECT
    personID, MAX(date), status
FROM
    orders
WHERE
    status = 4
GROUP BY
    personID

问题是,虽然这个DOES会为每个人提供最新订单日期的唯一记录,但它并没有给我正确的状态。换句话说,我假设状态与MAX(日期)正确相关,而不是。它只是随意地从其中一个订单中拉出其中一个状态。我可以添加特异性来说,从基本的角度来说,给出与MAX(日期)无关的同一记录的精确状态。

2 个答案:

答案 0 :(得分:1)

不幸的是,没有简单的方法来获得你想要的东西。除非所有非聚合结果字段都在GROUP BY中,否则大多数其他RDBMS供应商甚至不会将使用聚合函数的查询视为有效。这些问题的一般解决方案通常涉及一个子查询来获取“最后”记录,然后将其连接到原始表以获取这些行。

根据您的数据结构,这可能是也可能是不可能的。例如,如果您有多个具有相同personIDdate的行,则无法单独确定应使用哪个status

答案 1 :(得分:0)

要获得您想要的结果:

SELECT personId, date, status
FROM orders
WHERE (personID,date) IN (SELECT personID, MAX(date)
                          FROM orders
                          -- WHERE status = 4
                          GROUP BY personID);

至于:

  

它只是随机地从其中一个订单中拉出其中一个状态。

按预期工作:

  

MySQL扩展了GROUP BY的使用,以便选择列表可以引用   未在GROUP BY子句中命名的非聚合列。这意味着   前面的查询在MySQL中是合法的。您可以使用此功能   通过避免不必要的列排序来获得更好的性能   分组。 但是,这主要适用于每个值中的所有值   GROUP BY中未命名的非聚合列对于每个列都是相同的   组。服务器可以自由选择每个组中的任何值,所以   除非它们相同,否则所选择的值是不确定的

相关:Group by clause in mySQL and postgreSQL, why the error in postgreSQL?