并非如此简单的按日期分组2数据集mysql

并非如此简单的按日期分组2数据集mysql,mysql,sql,Mysql,Sql,我的数据库中有一个jobs表 工作属于专业 工作属于行业 工作属于区域 我想从表中选择作业,并根据date\u published字段对它们进行分组(计数),与另一组具有不同条件的作业进行比较 例如,我想选择2012-01-01之后发布的作业,按月/年对它们进行分组,以获得月度统计数据,并将总和与在where条件中指定了profession.id的另一组作业进行比较: SELECT count(jobs.id), count(jobs2.id), DATE(jobs.

我的数据库中有一个
jobs

工作属于专业
工作属于行业
工作属于区域

我想从表中选择作业,并根据
date\u published
字段对它们进行分组(计数),与另一组具有不同
条件的作业进行比较

例如,我想选择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
声明有关。系统中有许多作业具有相同的发布日期。日期。

在选择中选择日期列没有任何意义。您需要按日期分组,或者选择年和月部分

这种模式应该更快。根据具体要求,您可以删除嵌套查询:

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)上有一个索引将加快速度,因为引擎应该能够只使用索引回答查询


这是一个例子。有了这些数据,您希望得到什么样的答案?

首先使用显式
JOIN
语法。您也不应该
选择不在聚合中的属性。您好,我使用了内部联接来联接记录,但它对性能没有帮助。这看起来很有希望。我将在一段时间内让您知道结果。如何添加其他筛选语句?我还想按扇区id和区域id过滤数据。@user197483这取决于要将它们添加到比较的哪一侧。用少量的示例数据和所需的结果回答会容易得多。我想在比较的不同方面添加不同的陈述,并且我想同时创建两个以上的比较。本例简化了过滤器的数量,但根据用户的选择,在live数据库中有9个过滤器可动态应用。