クエリは、すべての雇用主のすべての仕事の数を返す必要がありますが、表示されるために一致する必要があるいくつかの基準があります。使用している暗黙の結合は、INNER JOIN です。行を含めるには、すべての条件が一致する必要があります。これは、「isActive」、「beenActive」、「status=1」であり、createdAt が過去 30 日未満であり、雇用者が「isActive」および「status=1」であるジョブのみを返すことを意味します。データをチェックして、これが必要かどうかを確認してください。
SELECT c.id AS employerID, count(*) as total
FROM employer as c, job as j
WHERE c.isActive=1 AND c.status=1
AND j.employerIDFK = c.id
AND j.isActive=1
AND j.beenActive=1
AND j.status=1
AND DATE_ADD( j.createdAt, INTERVAL 30 DAY ) > NOW()
GROUP BY c.id
createdAt のフィルターに関して他の人が言おうとしている限り、MySQL は最初に NOW() を (1 回だけ) 評価します。次に、createdAt の各日付に 30 日を追加して、NOW() より大きいかどうかを確認します。MySQL はこれを自動的に最適化する場合があり、バージョンやその他の要因によって異なりますが、一般に、各行の createdAt 日付に対して関数を実行して定数式と比較するのは良くありません。 createdAt 列。
したがって、次のように変換する必要があります。
AND DATE_ADD( j.createdAt, INTERVAL 30 DAY ) > NOW()
これに:
AND j.createdAt > DATE_ADD( NOW(), INTERVAL -30 DAY )
これにより、j.createdAt 列がプレーンな列として残されるため、MySQL は列に対して任意のインデックスを使用して、過去 30 日未満の日付を検索できるようになります。
これは、100 人がいる部屋に立って、誕生日に 30 日足すように頼んでから、計算された日付が今日より大きいのは誰かと尋ねるのと同じです。あなたはちょうど100人を働かせました。代わりに、今日の日付から 30 日を差し引いて基準を事前に計算し、単純にその日付より後の誕生日の人がいるかどうかを尋ねます。計算を 1 回行うだけで、100 人が大変な作業をする必要がなくなりました。