Mysql 具有最小值/最大值的SQL查询返回的行数少于不具有最小值/最大值的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
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是如何一起工作的,谢谢!似乎只是我误解了我们是如何一起工作的,谢谢!