【问题标题】:SELECTing additional column affects ORDER BY clause?选择附加列会影响 ORDER BY 子句?
【发布时间】:2013-05-16 22:22:00
【问题描述】:
$query = "
SELECT a_orders.id, a_orders.billing, a_orders.type, 
    SUM(a_order_rows.quant_refunded*a_order_rows.price*((100-a_orders.discount)*.01)) as refund_total, 
    SUM(a_order_rows.quant*a_order_rows.price*((100-a_orders.discount)*.01)) as order_total,
    GROUP_CONCAT(DISTINCT a_order_rows.date_refunded) as refund_dates
FROM a_order_rows JOIN a_orders 
ON a_order_rows.order_id = a_orders.id 
GROUP BY a_orders.id, a_orders.billing 
HAVING MAX(a_order_rows.quant_refunded) > 0 
ORDER BY a_order_rows.date_refunded DESC, a_orders.id DESC
LIMIT 50";

$query = "
SELECT a_orders.id, a_orders.billing, a_orders.type, 
    SUM(a_order_rows.quant_refunded*a_order_rows.price*((100-a_orders.discount)*.01))+a_orders.refund_adjustment as refund_total, 
    SUM(a_order_rows.quant*a_order_rows.price*((100-a_orders.discount)*.01)) as order_total,
    GROUP_CONCAT(DISTINCT a_order_rows.date_refunded) as refund_dates
FROM a_order_rows JOIN a_orders 
ON a_order_rows.order_id = a_orders.id 
GROUP BY a_orders.id, a_orders.billing 
HAVING MAX(a_order_rows.quant_refunded) > 0 
ORDER BY a_order_rows.date_refunded DESC, a_orders.id DESC
LIMIT 50";

注意到查询 2 的第 2 行中的 +a_orders.refund_adjustment?只是添加它正在改变结果的顺序。如果选择该列而不将其添加到聚合中,也会发生同样的事情(例如,在第 1 行的a_orders.type, 之后添加a_orders.refund_adjustment,)。

将该列添加到组合中后,结果不再按date_refunded DESC 的预期排序。是什么赋予了?我无法理解这会如何以任何方式影响结果顺序。

【问题讨论】:

    标签: sql select sql-order-by


    【解决方案1】:

    您在完成group by 后通过a_order_rows.date_refunded 订购。聚合包含此字段。

    MySQL 接受任何其他数据库中的错误。但是,它会从其中一个匹配行中选择一个 任意 值来放置在该字段中。这个任意值可以从一次查询执行更改为下一次执行。你不能依赖它。

    如果您想以更稳定的方式通过date_refunded 订购,请使用聚合函数:

    ORDER BY min(a_order_rows.date_refunded) DESC, a_orders.id DESC
    

    ORDER BY max(a_order_rows.date_refunded) DESC, a_orders.id DESC
    

    【讨论】:

    • 奇怪的是,它似乎按计划工作而没有选择附加字段,但这对我来说很有意义。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2014-07-17
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多