Mysql 分组依据中选择了哪一行?
假设我有一张桌子Mysql 分组依据中选择了哪一行?,mysql,sql,Mysql,Sql,假设我有一张桌子 +------+---------+--------+ | lang | title | url | +------+---------+--------+ | pt | Livro 1 | o294jl | | en | Book 1 | o294jl | | en | Book 2 | o294jl | +------+---------+--------+ 然后我运行一个查询 选择lang,title 从桌子上 按url分组 查询结果不明显,因
+------+---------+--------+
| lang | title | url |
+------+---------+--------+
| pt | Livro 1 | o294jl |
| en | Book 1 | o294jl |
| en | Book 2 | o294jl |
+------+---------+--------+
然后我运行一个查询
选择lang,title
从桌子上
按url分组
查询结果不明显,因为组中lang和title的值不同
SQL引擎如何选择从组返回哪一行?在我的示例中,必须选择哪一行?SQL标准中是否指定了它?从每个组的任意匹配行中选择值。这些值可以来自不同运行的不同行。理论上,同一个SELECT中的不同列可能来自不同的行
文件对此进行了解释:
如果仅禁用了_FULL _GROUP _BY,则标准的MySQL扩展
SQL使用GROUP BY允许选择列表、具有条件或
按列表排序以引用未聚合的列,即使列
功能上不依赖于GROUP BY列。在这种情况下,服务器可以自由地
从每个组中选择任意值,因此,除非它们相同,否则
选择的值是不确定的,这可能不是您想要的
需要
你应该阅读有关这一主题的全部内容
请注意,MySQL的默认行为现在是拒绝此类查询。耶 除了Gorden的答案之外,实际上引擎只做最少的工作,即从组中找到的第一行中选择值。但是–哪一行是第一行取决于执行计划,特别是所选索引 假设以下架构和数据:
CREATE TABLE test (
`lang` VARCHAR(2),
`title` VARCHAR(50),
`url` VARCHAR(50)
) engine=InnoDB;
INSERT INTO test (`lang`, `title`, `url`) VALUES
('pt', 'Livro 1', 'o294jl'),
('en', 'Book 1', 'o294jl'),
('en', 'Book 2', 'o294jl');
执行查询
SELECT lang, title FROM test GROUP BY url;
返回
| lang | title |
| ---- | ------- |
| pt | Livro 1 |
这是使用聚集索引按插入顺序排列的第一行
如果我们现在在url、lang、title上定义索引
相同的SELECT查询返回
| lang | title |
| ---- | ------ |
| en | Book 1 |
这是新url\u lang\u标题索引的第一行
如您所见:拥有完全相同的数据和完全相同的查询–MySQL可以返回不同的结果。即使不更改索引,也不能依赖于选择的特定索引。引擎可以出于许多其他原因选择其他索引
这个故事的寓意是:不要问引擎会返回什么。相反,通过编写确定性查询准确地告诉它您希望它返回的内容。-根据sql\u mode=ONLY\u FULL\u GROUP\u的标准,此查询无效,您将得到一个错误
| lang | title |
| ---- | ------ |
| en | Book 1 |