按 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的应用。

如果您让我们知道您对此查询的期望是什么,这将有助于我们为您提供帮助。

参考:

http://www.w3schools.com/sql/sql_groupby.asp

http://www.tutorialspoint.com/sql/sql-group-by.htm

当您执行 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;