0

我的数据库中有一个jobs表。

工作所属行业
工作所属行业
工作所属地区

我想从表中选择工作并按date_published字段对where应用不同条件的另一组工作进行分组(计数)。

例如,我想选择 2012 年 1 月 1 日之后发布的工作,按月/年对它们进行分组以获取月度统计数据,并将总和与在 where 条件中指定了职业 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日期。

4

1 回答 1

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

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

于 2012-12-01T00:10:43.773 回答