没有那么简单的按日期分组2个数据集mysql

时间:2012-11-30 23:54:21

标签: mysql sql

我的数据库中有一个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日期。

1 个答案:

答案 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。有了这些数据,您希望答案看起来像什么?