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
这个mySQL查询是如何工作的?_Mysql - Fatal编程技术网

这个mySQL查询是如何工作的?

这个mySQL查询是如何工作的?,mysql,Mysql,我试图了解mysql查询在使用和不使用GROUPBY时是如何工作的 假设我有一张电影演员表,每个演员ID都有一个对应的电影ID,所以同一个演员参与了N部不同的电影 我想挑选参与20部电影的演员: SELECT actor_id FROM film_actor GROUP BY actor_id HAVING COUNT(film_id) = 20; 此查询工作并返回参与20部电影的演员ID。 但如果我这么做了呢: SELECT actor_id FROM film_actor HAVING C

我试图了解mysql查询在使用和不使用GROUPBY时是如何工作的

假设我有一张电影演员表,每个演员ID都有一个对应的电影ID,所以同一个演员参与了N部不同的电影

我想挑选参与20部电影的演员:

SELECT actor_id FROM film_actor GROUP BY actor_id HAVING COUNT(film_id) = 20;
此查询工作并返回参与20部电影的演员ID。 但如果我这么做了呢:

SELECT actor_id FROM film_actor HAVING COUNT(film_id) = 20;
为什么此查询仅在等于film_actor表(5463)的大小时返回值:


在本例中,它返回我actor_id=1。为什么?是否选择电影ID而不考虑相应的演员ID?

按组分组根据以下列的值对结果进行分组,通常与聚合函数(例如,计数)一起使用

因此,第一个查询为actor_id的每个值返回一行,HAVING将结果限制为计数为20的结果


如果没有GROUPBY子句,聚合函数将作用于所有行。因此,您的第二个查询是选择actor_id,其中电影的计数为20,但不分组,计数为5463(即表中的行数)。在此情况下返回的参与者id未确定(即,可以是其中任何一个)。

在第二个查询中没有
GROUP BY
。在HAVING子句中使用聚合函数
COUNT
,意味着查询最多返回一行

与此查询进行比较:

SELECT actor_id, COUNT(film_id) FROM film_actor
它返回一行,例如

actor_id  COUNT(film_id)
--------  --------------
      42            5463
(注意:默认情况下,MySQL将返回该查询的结果。其他数据库将拒绝该查询,并引发“非聚合不在group By中”键入错误。问题在于
选择列表中对
参与者id
的引用。要使该查询在其他数据库中工作,我们需要从选择列表中删除
参与者id
。如果我们将
sql\u模式
设置为只包含
完整组
,我们可以让MySQL以同样的方式运行

请注意,
actor\u id
返回的值是来自“某行”的值。返回值的行不确定,它可以来自任何行。
COUNT
返回的值来自整个表


如果您想要每个参与者的
计数
,则需要一个
GROUPBY
子句,就像在第一个查询中一样

    SELECT actor_id, COUNT(film_id) FROM film_actor GROUP BY actor_id
从该查询开始,可以添加一个
HAVING
子句。您还可以从
选择列表中删除
计数(胶片id)
。但是,如果不影响
计数(film\u id)

返回的内容,则无法通过
删除
组,因此假设您有:

+---------------------------------+
| actor_id | actor_name | film_id |
+---------------------------------+
|        4 |       John |       3 |
|        4 |       John |       4 |
|        5 |       Alex |       3 |
+---------------------------------+
运行时:

SELECT actor_id, COUNT(film_id) AS Films FROM film_actor GROUP BY actor_id;
我们将得到:

+------------------+
| actor_id | Films |
+------------------+
|        4 |     2 |
|        5 |     1 |
+------------------+
因此,我们可以:

SELECT actor_id, COUNT(film_id) AS Films FROM film_actor GROUP BY actor_id WHERE Films = 2;

这应该只返回actor_id为4。

看看这个问题(及其选定的答案)是否有帮助:您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。。。但是,服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。因此,在您的例子中,系统从5463个参与者的表中随机选择一个参与者ID。mysql group by extensions不是第一个也不是最后一个出现问题的。想想它的名字吧<代码>分组依据
将帮助您获得字段每组的结果。没有它,只有一个组,即整个表。这一行中显示的值是任意的。因此,使用only COUNT()将从表中获取所有电影ID计数的值,而不考虑演员ID,并且只返回一行。对吗?@PedroBarros我要跳进去说是的,没错。简单地考虑一下,
groupby
可以帮助您获得每组的结果。如果使用该子句,则会得到每组参与者的编号。没有它,只有一组,整个桌子。@Pedros:回应McAdams331,是的,这是正确的。如果没有
GROUP BY
子句,聚合函数(例如
COUNT
SUM
MAX
等)将作为一个单独的组在集合上运行。Upvoting用于显示
GROUP BY
所做工作的具体示例。如果不使用GROUPBY,还可以添加一个反例来显示表的结果。
SELECT actor_id, COUNT(film_id) AS Films FROM film_actor GROUP BY actor_id WHERE Films = 2;