0

データベースにjobsテーブルがあります。

仕事は職業に
属します仕事はセクターに
属します仕事は地域に属します

テーブルからジョブを選択し、さまざまな条件が適用されたdate_published別のジョブのセットに対して、フィールドごとにそれらをグループ化(カウント)したいと思います。where

たとえば、2012-01-01以降に公開されたジョブを選択し、月/年でグループ化して月次統計を取得し、その合計を、次の条件で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同じ日付のシステムには多くのジョブがあります。

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 に答える