我希望有一个表格上有几个统计信息(摘要)。表名是“jobs”,一些所需的统计信息是:
活跃的职位数,处于非活动状态的职位数,需要男性职位的职位数,每月支付超过x金额的职位数,......
我需要一个查询来从“作业”表中提取所有这些统计信息,然后输入一行结果。查询结果应如下所示:
+---------------+---------------+---------------+-----+
| stats1_column | stats2_column | stats3_column | ... |
+---------------+---------------+---------------+-----+
| x | y | z | ... |
+---------------+---------------+---------------+-----+
毕竟,您认为我获取表格摘要正如我正在做的那样吗?或者我错了,还有更好的方法吗?
我正在使用MySQL数据库开发一个PHP项目。
答案 0 :(得分:1)
您可能会对每个类别使用COUNT()
聚合函数,然后使用UNION ALL
,然后按GROUP_CONCAT()
将行转换为列。以下是您可能拥有的查询:
SELECT
GROUP_CONCAT(if(Category = 'Active Jobs', CategoryCount, NULL)) AS 'Active_Jobs',
GROUP_CONCAT(if(Category = 'Inactive Jobs', CategoryCount, NULL)) AS 'Inactive_Jobs'
FROM
(
SELECT 'Active Jobs' as Category, COUNT(*) as CategoryCount
FROM Jobs
WHERE Status = 'Active'
UNION ALL
SELECT 'Inactive Jobs' as Category, COUNT(*) as CategoryCount
FROM Jobs
WHERE Status = 'Inactive'
) tbl
参见示例 Fiddle Demo
答案 1 :(得分:0)
这将是这样的:
SELECT SUM(IF(active, 1, 0)) stats_active,
SUM(IF(active, 0, 1)) stats_inactive,
SUM(IF(needs_male, 1, 0)) stats_needs_male,
SUM(IF(pay > 1000, 1, 0)) stats_well_paid,
.... and so on ....
FROM jobs
这种方法/查询的问题在于它效率低,因为它扫描整个表。如果表有很多行,性能将受到影响。
如果表具有正确的索引,则更有效的方法是为您需要的每个统计信息运行查询。在PHP中,这将是(忽略拼写错误):
$stats = array(
'stats_active' => 'SELECT COUNT(*) FROM jobs WHERE active',
'stats_inactive' => 'SELECT COUNT(*) FROM jobs WHERE NOT active',
'stats_needs_male' => 'SELECT COUNT(*) FROM jobs WHERE needs_male',
.... others here ....
);
$result = (object) array();
foreach($stats as $name => $query) {
$result->$name = db_fetch_single_result($query); // database specific code goes here
}
答案 2 :(得分:-1)
这是一种难以阅读,但我认为你想要的,但可能是错的是这样的?
Select
stats1_column,
stats2_column,
stats3_colum
From
Jobs
这是非常基本的,为什么我不确定这是否是你想要的。