Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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 具有最小值/最大值的SQL查询返回的行数少于不具有最小值/最大值的SQL查询返回的行数_Mysql_Sql - Fatal编程技术网

Mysql 具有最小值/最大值的SQL查询返回的行数少于不具有最小值/最大值的SQL查询返回的行数

Mysql 具有最小值/最大值的SQL查询返回的行数少于不具有最小值/最大值的SQL查询返回的行数,mysql,sql,Mysql,Sql,我有一个类似以下内容的SQL查询: SELECT A.*, C.value FROM A JOIN B ON B.group = A.group JOIN C ON C.a = A.id GROUP BY A.group 此查询返回一定数量的行。由于GROUP BY,我试图指定如果有多个具有相同值的A.GROUP,我想要哪一行-因此我添加了HAVING子句: SELECT A.*, C.value FROM A JOIN B ON B.group = A.group JOIN C ON C.a

我有一个类似以下内容的SQL查询:

SELECT A.*, C.value
FROM A
JOIN B ON B.group = A.group
JOIN C ON C.a = A.id
GROUP BY A.group
此查询返回一定数量的行。由于GROUP BY,我试图指定如果有多个具有相同值的
A.GROUP
,我想要哪一行-因此我添加了HAVING子句:

SELECT A.*, C.value
FROM A
JOIN B ON B.group = A.group
JOIN C ON C.a = A.id
GROUP BY A.group
HAVING C.value = MIN(C.value)
我的理解是MySQL应该首先应用所有连接和其他条件,然后进行分组。由于我只是要求得到具有最小
C.value
的行,因此分组不应消除任何情况

但是后一个查询返回的行比前一个查询少。为什么会这样?我怎样才能达到期望的行为

(服务器正在运行MySQL 5.1)

我的理解是MySQL应该首先应用所有的连接和 其他条件,然后进行分组。既然我只是问 对于具有最小C.值的行,不应进行分组 消除任何情况

但是后一个查询返回的行比前一个查询少。为什么 我怎样才能达到期望的行为

您所说的是正确的,但是“having”在分组解决之前没有效果。通过将
HAVING C.value=MIN(C.value)
添加到任何查询中,您的意思是在该查询中执行所有操作,然后只返回最小值为C的结果。此HAVING语句将始终返回较少(或相等)的行数

我的理解是MySQL应该首先应用所有的连接和 其他条件,然后进行分组。既然我只是问 对于具有最小C.值的行,不应进行分组 消除任何情况

但是后一个查询返回的行比前一个查询少。为什么 我怎样才能达到期望的行为


您所说的是正确的,但是“having”在分组解决之前没有效果。通过将
HAVING C.value=MIN(C.value)
添加到任何查询中,您的意思是在该查询中执行所有操作,然后只返回最小值为C的结果。此HAVING语句将始终返回较少(或相等)的结果行数。

我相信您在查询中看到的主要问题是,返回了多个
A.Group
结果。这是因为您仅将
A.Group
列添加到
Group BY
,但您正在
选择
A.*
(其中还包括
A
ID
)。这样做会产生如下结果:

A.Id     A.Group    C.Value
1        1          1
2        1          2
3        2          1
4        3          1
5        3          2
,但不建议这样做,因为这会导致不可预测的结果

我理解你的问题,你希望的结果更像这样:

A.Group    C.Value
1          1
2          1
3          1
获得所需结果的方法很简单:
选择
MIN(C.Value)
,然后只选择
A.Group

SELECT A.Group, MIN(C.value)
FROM   A
JOIN   B ON B.group = A.group
JOIN   C ON C.a = A.id
GROUP BY A.group
但是后一个查询返回的行比前一个查询少。为什么会这样?我怎样才能达到期望的行为


它自然会返回较少的记录,因为您限制了结果

我相信您在查询中看到的主要问题是,返回了多个
A.Group
结果。这是因为您仅将
A.Group
列添加到
Group BY
,但您正在
选择
A.*
(其中还包括
A
ID
)。这样做会产生如下结果:

A.Id     A.Group    C.Value
1        1          1
2        1          2
3        2          1
4        3          1
5        3          2
,但不建议这样做,因为这会导致不可预测的结果

我理解你的问题,你希望的结果更像这样:

A.Group    C.Value
1          1
2          1
3          1
获得所需结果的方法很简单:
选择
MIN(C.Value)
,然后只选择
A.Group

SELECT A.Group, MIN(C.value)
FROM   A
JOIN   B ON B.group = A.group
JOIN   C ON C.a = A.id
GROUP BY A.group
但是后一个查询返回的行比前一个查询少。为什么会这样?我怎样才能达到期望的行为


它自然会返回较少的记录,因为您限制了结果

虽然
MySQL
允许这样做,但如果不将所有非聚合列添加到
分组依据
中,将导致不可预测的结果,因此不建议这样做。您的语句“multiple with the same value for A.GROUP”没有意义,您是按该值分组的,对吗?结果中应该只有一行。具有最小值/最大值的查询返回的行数少于不具有的行数-因为
具有
通常排除行“因为我只是要求具有最小C.value的行”-这不是
分组依据
的作业<代码>分组依据
不会从查询中涉及的表中返回行。它使用查询的
FROM/WHERE
部分检索到的数据生成新行。虽然
MySQL
允许这样做,但如果不将所有非聚合列添加到
GROUP by
中,将导致不可预测的结果,因此不建议这样做。您的语句“multiple with the same value for A.GROUP”没有意义,您是按该值分组的,对吗?结果中应该只有一行。具有最小值/最大值的查询返回的行数少于不具有的行数-因为
具有
通常排除行“因为我只是要求具有最小C.value的行”-这不是
分组依据
的作业<代码>分组依据
不会从查询中涉及的表中返回行。它使用查询的
FROM/WHERE
部分检索的数据生成新行。似乎我误解了have和GROUP by是如何一起工作的,谢谢!似乎只是我误解了我们是如何一起工作的,谢谢!