我回答了这个问题:https://stackoverflow.com/a/18521684/1707323查询类似于:
SELECT
*
FROM
(
SELECT
*
FROM
table_name
WHERE
table_name.some_field='1' OR
table_name.some_field='2'
ORDER BY
table_name.some_field
) sub_query
GROUP BY
sub_query.primary_key_column
评论已经发表了
聪明的想法,但这不能保证在MySQL中工作,并且会 在SQL Server和大多数其他数据库系统中导致硬错误。 引自Extensions to GROUP BY:“服务器是免费的 从每个组中选择任何值,所以除非它们相同,否则 选择的值是不确定的。此外,选择价值观 添加ORDER BY子句不会影响每个组。
对于您的特定版本的MySQL,完全有可能 你的特定表格,它总会给你你想要的结果, 因为您获得的查询计划会导致您的查询被执行 正是你期望的方式。但如果文档明确说明 它将不确定地选择一个值,并且你的ORDER BY是 不足以使这个查询可靠,我会非常谨慎 在其他数据库或其他版本的MySQL上尝试此操作。
MySQl手册还继续说:Sorting of the result set occurs after values have been chosen, and ORDER BY does not affect which values within each group the server chooses.
对于诸如
SELECT
*
FROM
table_name
WHERE
table_name.some_field='1' OR
table_name.some_field='2'
GROUP BY
table_name.primary_key_column
ORDER BY
table_name.some_field
但这与子查询中带有order by子句的查询不同。我确实找到了similar question,但它又不涉及子查询中的ORDER BY子句
任何人都可以参考MySQL手册对这一点有所了解,子查询中的ORDER BY
子句是否会强制分组以始终使用该组的第一个实例。
编辑:观察
不应该FIFO or LIFO与GROUP BY的操作方式有关吗?我无法理解:
服务器可以自由选择每个组中的任何值
这种选择必须有某种逻辑。如果没有某种指令,计算机不允许自己做出选择。如果计算机可以在没有任何指令的情况下自行做出选择,那么我们真正达到了计算,人工智能的最终目标,现在计算机可以通过为应用程序提供一个指令来编写我的所有代码。 [哈哈]这是无证逻辑的几率是多少?在逻辑中RAND不会比FIFO或FILO获得更多的处理能力吗?这里必须有一些逻辑可能只是没有记录,但在100%的时间都有效。我一直喜欢的一件事是几何中的证明。我了解到你必须证明它是对还是错。我可以证明它是如何工作的,但我还没有看到它是如何工作的。如果它以这种方式工作或证明如果它不那样工作则证明它是如此。
答案 0 :(得分:1)
没有。内联视图中的ORDER BY
不会强制外部查询中的GROUP BY
操作从组中的“第一”行获取非聚合值。 MySQL可以自由选择组中的任何行。
您可能会发现这是发生的事情,但此行为不是保证。
使用不同的数据库引擎,或者补丁集或更新版本的MySQL,行为可能会有所不同,或者只是随表中的值分布而改变。
(基于更新的问题)
SQL(结构化查询语言)背后的想法是它是声明性的,因为它声明了要返回的结果集,并且没有指定返回结果集的“方式”。
你是完全正确的,编写良好的代码本质上不是“随机的”,它遵循一组规则执行,并且我们观察到一致的行为。但是,这并不能保证此行为不会发生变化。 (编译器实现优化,导致机器代码产生相同的结果,但操作方式不同。)
多年来,当我们在Oracle中执行GROUP BY
时,我们发现Oracle会使用排序操作作为满足GROUP BY
的“方法”的一部分。每次我们运行相同的查询时,Oracle都会做同样的事情。但Oracle从未做过保证,总是会使用排序操作。
当推出新版本的Oracle时,我们发现Oracle现在正在使用散列操作而不是排序操作来满足GROUP BY。包含ORDER BY
子句的任何查询都会继续以指定的顺序返回结果(保证行为),但是其他没有ORDER BY
的查询会以不同的顺序返回行。 Oracle刚刚改进了如何准备满足要求的结果集。
这个例子说明了为什么我们不编写依赖于保证的行为的查询。
在MySQL的一些后续版本中,我们可能会观察到行为的变化,其中查询返回的结果集保证符合规范,但与当前返回的结果集不同。
SQL的主要设计目标之一是我们声明要返回的结果集,而不指定DBMS如何生成结果集。我们确实使用了提示,并且我们以某种方式构造查询,这确实会影响优化器生成的执行计划。但这不是保证。
如果结果集要满足指定的要求,则SQL应该包含该规范;我们不应该依赖于特定的观察行为来暗示该规范。