Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 分组依据中选择了哪一行?_Mysql_Sql - Fatal编程技术网

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 |