我有一张表格,其中包含代表已下订单的人的重复IDs
。这些订单中的每一个都有一个日期。每个订单的状态代码为1 - 4. 4表示已取消的订单。我使用以下查询:
SELECT
personID, MAX(date), status
FROM
orders
WHERE
status = 4
GROUP BY
personID
问题是,虽然这个DOES会为每个人提供最新订单日期的唯一记录,但它并没有给我正确的状态。换句话说,我假设状态与MAX(日期)正确相关,而不是。它只是随意地从其中一个订单中拉出其中一个状态。我可以添加特异性来说,从基本的角度来说,给出与MAX(日期)无关的同一记录的精确状态。
答案 0 :(得分:1)
不幸的是,没有简单的方法来获得你想要的东西。除非所有非聚合结果字段都在GROUP BY中,否则大多数其他RDBMS供应商甚至不会将使用聚合函数的查询视为有效。这些问题的一般解决方案通常涉及一个子查询来获取“最后”记录,然后将其连接到原始表以获取这些行。
根据您的数据结构,这可能是也可能是不可能的。例如,如果您有多个具有相同personID
和date
的行,则无法单独确定应使用哪个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?