MySQL:计算每个字段中的不同值
MySQL: Count different values in each of the fields
我不确定 Stack Overflow 上是否没有答案,但我在那里没有找到确切的答案。
所以,我有一个 table 数据如下:
id | sector | type | level
| | |
1 | TMT | Long | First
2 | Energy | Long | Second
3 | TMT | Short | Third
4 | Other | Long | First
5 | TMT | N/A | Sixth
6 | Other | Short | First
我需要的是每个字段中每个不同值的摘要,如下所示:
Sector TMT: 3
Sector Energy: 1
Sector Other: 2
Type Long: 3
Type Short: 2
Type N/A: 1
Level First: 3
Level Second: 1
Level Third: 1
Level Sixth: 1
Type和Level有固定值。扇区可能是动态的,我的意思是没有最终列表,因为它们是随每个项目添加的。
现在我正在 select 处理所有行并用 PHP:
处理它
SELECT `sector`, `type`, `level` FROM `table`;
例如:
<?php
$result['type_long'] = 0;
$result['type_short'] = 0;
$result['type_na'] = 0;
foreach ($rows as $row)
{
if ($row['type'] == 'Long')
{
$result['type_long']++;
}
else if ($row['type'] == 'Short')
{
$result['type_short']++;
}
else if ($row['type'] == 'N/A')
{
$result['type_na']++;
}
}
等对于 10000 条记录,它并不是很快,因为我需要 select 数据库中的所有行,然后通过 PHP.
对它们做一些事情
有什么方法可以让我用 MySQL 更快地做到这一点?
谢谢!
这是合并多个摘要查询的直接应用。典型的摘要查询是
SELECT Sector, COUNT(*) cnt
FROM mytable
GROUP BY Sector
要获得准确的结果集,您可以这样做:
SELECT CONCAT('Sector ', Sector, ':') item, COUNT(*) cnt FROM mytable GROUP BY Sector
UNION ALL
SELECT CONCAT('Type ', Type, ':') item, COUNT(*) cnt FROM mytable GROUP BY Type
UNION ALL
SELECT CONCAT('Level', Level, ':') item, COUNT(*) cnt FROM mytable GROUP BY Level
如果您希望速度达到最佳,您可以尝试在三列上添加索引。
MySQL 非常擅长处理高性能的摘要查询。即使在此 UNION 中有多个单独的 SELECT 查询,它的性能也比将所有原始数据行从服务器传输到 MySQL 程序要好一个数量级。
我不确定 Stack Overflow 上是否没有答案,但我在那里没有找到确切的答案。 所以,我有一个 table 数据如下:
id | sector | type | level
| | |
1 | TMT | Long | First
2 | Energy | Long | Second
3 | TMT | Short | Third
4 | Other | Long | First
5 | TMT | N/A | Sixth
6 | Other | Short | First
我需要的是每个字段中每个不同值的摘要,如下所示:
Sector TMT: 3
Sector Energy: 1
Sector Other: 2
Type Long: 3
Type Short: 2
Type N/A: 1
Level First: 3
Level Second: 1
Level Third: 1
Level Sixth: 1
Type和Level有固定值。扇区可能是动态的,我的意思是没有最终列表,因为它们是随每个项目添加的。
现在我正在 select 处理所有行并用 PHP:
处理它SELECT `sector`, `type`, `level` FROM `table`;
例如:
<?php
$result['type_long'] = 0;
$result['type_short'] = 0;
$result['type_na'] = 0;
foreach ($rows as $row)
{
if ($row['type'] == 'Long')
{
$result['type_long']++;
}
else if ($row['type'] == 'Short')
{
$result['type_short']++;
}
else if ($row['type'] == 'N/A')
{
$result['type_na']++;
}
}
等对于 10000 条记录,它并不是很快,因为我需要 select 数据库中的所有行,然后通过 PHP.
对它们做一些事情有什么方法可以让我用 MySQL 更快地做到这一点?
谢谢!
这是合并多个摘要查询的直接应用。典型的摘要查询是
SELECT Sector, COUNT(*) cnt
FROM mytable
GROUP BY Sector
要获得准确的结果集,您可以这样做:
SELECT CONCAT('Sector ', Sector, ':') item, COUNT(*) cnt FROM mytable GROUP BY Sector
UNION ALL
SELECT CONCAT('Type ', Type, ':') item, COUNT(*) cnt FROM mytable GROUP BY Type
UNION ALL
SELECT CONCAT('Level', Level, ':') item, COUNT(*) cnt FROM mytable GROUP BY Level
如果您希望速度达到最佳,您可以尝试在三列上添加索引。
MySQL 非常擅长处理高性能的摘要查询。即使在此 UNION 中有多个单独的 SELECT 查询,它的性能也比将所有原始数据行从服务器传输到 MySQL 程序要好一个数量级。