私がここでやろうとしているのは、特定の仕事に応募したか、特定の仕事にタグ付けされたすべての応募者を、仕事を選択してから検索するタグを選択することによって取得することです。これが私が使用しているSQLステートメントです。
SELECT ap.user_id, ap.job_id as jobId, date(app_date) AS appDate, count(*) AS `count` ,jt.name AS title, a.*, ap.app_id
FROM applications ap
LEFT JOIN jobs j ON ap.job_id = j.job_id
LEFT JOIN job_titles jt ON jt.name = j.title
LEFT JOIN applicants a ON a.applicant_id = ap.user_id
LEFT JOIN applicant_tags at ON at.applicant_id = ap.user_id
LEFT JOIN tags t ON t.id = at.tag_id
WHERE ap.favorite = 1
AND LOWER(jt.name) = LOWER('fisherman')
AND (LOWER(t.name) = LOWER('confident')
OR LOWER(t.name) = LOWER('hard worker'))
GROUP BY ap.app_id
HAVING `count` = '2'
ORDER BY jt.name
ここでの問題は、その仕事に応募した応募者のみを取得し、そのタイプの仕事にタグ付けされた応募者を取得していないことです。求人名自体はタグとして保存されませんが、代わりに、次のようなapplicant_tagsテーブルを介して各応募者にリンクされます。
applicant_id | tag_id | job_id
34 0 4
34 4 0
34 0 5
32 7 0
Application_id は、アプリケーションの user_id、タグ ID による tag_id、および job_titles ID による job_id を介してアプリケーションにリンクします。tags テーブルと job_titles テーブルには、ID と名前しかありません。
タグテーブルは次のとおりです。
id | tag_id
job_titles テーブル:
id | name
申請者は、申請者のすべての個人情報 (電子メール、電話番号) と、外部キーとして使用されている Application_id を持っています。
アプリケーションとジョブの情報が多すぎて一覧表示できず、実際に使用されている列はごくわずかです。
アプリケーション テーブル
app_id | user_id | job_id | app_date | favorites .....
ジョブ テーブル
job_id | title | location | jobtype .....
応募者の tag_id は、job_id がある場合は 0 であり、その逆も同様です。タグ名とジョブ名はカンマ区切りの値として保存されるのではなく、applicant_id によって各応募者にリンクされた 1 つの行に単一の値として保存されます。jobs の job_id は、求人名ではなく、応募された求人の ID です。各応募者には、複数のタグを関連付けたり、複数のジョブ名を関連付けたりすることができます。タグ ステートメント LOWER(t.name) = LOWER(タグ名) は、検索で使用されているタグの数に基づいて追加されます。その情報とアプリケーションで呼び出されているものがページに表示されるため、私は応募者からすべてを取得しています。
applications ap は ap.job_id によってジョブにリンクされ、applicant_tags は ap.applicant_id = at.applicant_id によってリンクされ、申請者は ap.applicant_id = a.applicant_id によってリンクされます。
job_titles jt は、jt.name = j.title によって job j にリンクされ、j.id = at.job_id によって application_tags にリンクされます
tags t は、t.id = at.tag_id によって、applicant_tags にリンクされています
集計テーブルも使用できません。
では、jobs テーブルから job_titles テーブルではなく、applicant_tags テーブルから job_titles テーブルに、ジョブ名にリンクされているアプリケーションを取得するにはどうすればよいでしょうか?
-編集
SQL ステートメントをリファクタリングした後、すべての応募者が表示されますが、タグは表示されず、タグを検索しようとしても結果が返されません。
SELECT ap.user_id, jt.id as jobId, date(app_date) AS appDate, jt.name AS title, count(*) AS `count`, at.*, a.*, ap.app_id, t.*
FROM applications ap
INNER JOIN applicants a ON ap.user_id = a.applicant_id
LEFT JOIN applicant_tags at ON at.applicant_id = a.applicant_id
LEFT JOIN tags t ON at.tag_id = t.id
LEFT JOIN job_titles jt ON at.job_id = jt.id
WHERE ap.favorite = '1'
AND LOWER(jt.name) = LOWER('fisherman')
GROUP BY ap.app_id
HAVING `count` = '1'
ORDER BY jt.name