我的数据库中有一个jobs
表。
工作属于专业
工作属于部门
工作属于地区
我想从表格中选择作业,并将date_published
字段对其进行分组(计数),并对应用了不同where
条件的另一组作业进行分组。
例如,我想选择在2012-01-01之后发布的作业,按月/年对它们进行分组以获取每月统计数据,并将总和与在where条件中指定的具有profession.id的另一组作业进行比较:
SELECT count(jobs.id),
count(jobs2.id),
DATE(jobs.date_published)
FROM jobs, jobs jobs2
WHERE jobs.date_published > '2010-01-01'
AND jobs.date_published = jobs2.date_published,
AND jobs2.profession_id IN (1, 2, 3)
GROUP BY
MONTH(jobs.date_published),
YEAR(jobs.date_published)
ORDER BY
YEAR(jobs.date_published) DESC,
MONTH(jobs.date_published) DESC
但上面的示例是错误的,因为它导致服务器无法响应并处理无穷大的查询。我该如何解决?
我认为它与jobs.date_published = jobs2.date_published
声明有关。系统中有许多作业具有相同的date_published
日期。
答案 0 :(得分:0)
在选择中选择日期列没有任何意义。您需要按日期分组,或选择年份和月份。
这种模式应该更快。根据具体要求,您可以删除嵌套查询:
Select
Year(date_published) Year,
Month(date_published) Month,
Sum(job_count_1) job_count_1,
Sum(job_count_2) job_count_2
From (
Select
date_published,
Sum(Case When profession_id In (1, 2, 3) Then 1 Else 0 End) as job_count_1,
Count(*) as job_count_2
From
jobs
Where
date_published > '2010-01-01'
Group By
date_published
Having
Sum(Case When profession_id In (1, 2, 3) Then 1 Else 0 End) > 0
) a
Group By
Year(date_published),
Month(date_published)
Order By
1 Desc,
2 Desc
在(date_published,profession_id)上设置索引会加快速度,因为引擎应该只能使用索引来回答查询。
这是一个example。有了这些数据,您希望答案看起来像什么?