按 mysql 中的查询行为分组
Group by query behaviour in mysql
Table in mysql 包含以下记录:
+----------+----------+-----------+---------+-------+
| PersonID | LastName | FirstName | Address | City |
+----------+----------+-----------+---------+-------+
| 1 | Kumar | Amit | Sec-22 | Noida |
| 2 | Kapoor | X | Sec-24 | Noida |
| 3 | Kapoor | Y | Sec-22 | Delhi |
| 4 | Kapoor | Z | Sec-25 | Delhi |
| 5 | Kapoor | W | Sec-25 | Gzb |
+----------+----------+-----------+---------+-------+
当我 运行 以下查询时:
select City, FirstName from Persons group by City;
下面是显示的结果:
+-------+-----------+
| City | FirstName |
+-------+-----------+
| Delhi | Y |
| Gzb | W |
| Noida | Amit |
+-------+-----------+
我不明白为什么 table 中没有显示每个城市的所有名字,因为诺伊达和德里各有 2 条记录,Gzb 有 1 条记录
请帮助我理解这种行为。
在 MYSQL
returns 第一行条目中分组,并根据具有分组过滤器的列对其余条目进行分组。
在你的例子中,德里有 Y 和 Z,它分为 1 行,但会显示 Y,因为那是第一行。我不确定 MS-SQL
,我认为它的工作方式与 MYSQL
中的分组工作方式相同
分组依据显示您拥有的第一个条目。
查询:
select count(*) from Persons group by City;
您将按分组进行计数。我认为查询:
select City, FirstName from Persons order by City asc;
对你想要的更有用。
@Amitsh
一般情况下,Group By与聚合函数结合使用(聚合数据)。
假设 FirstName 是一个 "character" 字段,因此解释器默认按 FIRST() 值对列 FirstName 进行分组。
你会得到预期的输出,假设每个人都有一个工资列,你想显示在一个城市赚取的工资。 (举个例子)
您可以参考以下链接了解Group By的应用。
如果您让我们知道您对此查询的期望是什么,这将有助于我们为您提供帮助。
参考:
当您执行 group by
并尝试 select 同一查询中的一些其他列时,mysql 不保证将从 select 编辑什么值全部,它会随机取一个数据。
在您的情况下,查询是
select City, FirstName from Persons group by City;
所以当您 group by City
时,它将 select City
和该城市的任何 Firstname
比 group by
更适合求和、计数等聚合函数
然而,您可以使用 group_concat()
函数 as
修改查询以获取所有名字作为逗号分隔的字符串
select
City,
group_concat(FirstName) as FirstNames
from Persons group by City;
Table in mysql 包含以下记录:
+----------+----------+-----------+---------+-------+
| PersonID | LastName | FirstName | Address | City |
+----------+----------+-----------+---------+-------+
| 1 | Kumar | Amit | Sec-22 | Noida |
| 2 | Kapoor | X | Sec-24 | Noida |
| 3 | Kapoor | Y | Sec-22 | Delhi |
| 4 | Kapoor | Z | Sec-25 | Delhi |
| 5 | Kapoor | W | Sec-25 | Gzb |
+----------+----------+-----------+---------+-------+
当我 运行 以下查询时:
select City, FirstName from Persons group by City;
下面是显示的结果:
+-------+-----------+
| City | FirstName |
+-------+-----------+
| Delhi | Y |
| Gzb | W |
| Noida | Amit |
+-------+-----------+
我不明白为什么 table 中没有显示每个城市的所有名字,因为诺伊达和德里各有 2 条记录,Gzb 有 1 条记录
请帮助我理解这种行为。
在 MYSQL
returns 第一行条目中分组,并根据具有分组过滤器的列对其余条目进行分组。
在你的例子中,德里有 Y 和 Z,它分为 1 行,但会显示 Y,因为那是第一行。我不确定 MS-SQL
,我认为它的工作方式与 MYSQL
分组依据显示您拥有的第一个条目。
查询:
select count(*) from Persons group by City;
您将按分组进行计数。我认为查询:
select City, FirstName from Persons order by City asc;
对你想要的更有用。
@Amitsh
一般情况下,Group By与聚合函数结合使用(聚合数据)。
假设 FirstName 是一个 "character" 字段,因此解释器默认按 FIRST() 值对列 FirstName 进行分组。
你会得到预期的输出,假设每个人都有一个工资列,你想显示在一个城市赚取的工资。 (举个例子)
您可以参考以下链接了解Group By的应用。
如果您让我们知道您对此查询的期望是什么,这将有助于我们为您提供帮助。
参考:
当您执行 group by
并尝试 select 同一查询中的一些其他列时,mysql 不保证将从 select 编辑什么值全部,它会随机取一个数据。
在您的情况下,查询是
select City, FirstName from Persons group by City;
所以当您 group by City
City
和该城市的任何 Firstname
比 group by
更适合求和、计数等聚合函数
然而,您可以使用 group_concat()
函数 as
select
City,
group_concat(FirstName) as FirstNames
from Persons group by City;