我在这里要做的是通过选择工作然后选择要搜索的标签来获取所有已申请某项工作或已被标记为某项工作的申请人。这是我正在使用的 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_id | tag_id | job_id
34 0 4
34 4 0
34 0 5
32 7 0
申请人id 通过应用程序user_id 链接到应用程序,tag_id 通过标签id 链接到应用程序,job_id 通过job_titles id 链接到应用程序。tags 表和 job_titles 表中只有一个 id 和 name。
这是标签表:
id | tag_id
job_titles 表:
id | name
申请人拥有申请人的所有个人信息(电子邮件、电话号码)以及用作外键的申请人id。
应用程序和作业有太多信息无法列出,实际上只有几列被使用。
应用程序表
app_id | user_id | job_id | app_date | favorites .....
工作表
job_id | title | location | jobtype .....
如果申请人有 job_id,则 tag_id 为 0,反之亦然。标签名称和职位名称不存储为逗号分隔值,而是存储为一行中的单个值,该值通过其申请者 ID 链接到每个申请者。jobs中的job_id是申请的职位id,不是职位名称。每个申请人可以有多个与之关联的标签和多个与其关联的职位名称。标签语句 LOWER(t.name) = LOWER(tag name) 是根据搜索中使用的标签数量添加的。我从申请人那里得到所有信息,因为这些信息和申请中调用的内容将显示在页面上。
应用程序 ap 通过 ap.job_id 链接到工作,通过 ap.applicant_id = at.applicant_id 链接到申请者标签,通过 ap.applicant_id = a.applicant_id 链接申请者。
job_titles jt 通过 jt.name = j.title 链接到工作 j 并通过 j.id = at.job_id 链接到 application_tags at
标签 t 通过 t.id = at.tag_id 链接到申请者标签
我也不能使用聚合表。
那么,我如何才能获取链接到职位名称的应用程序,而不是从作业表到 job_titles 表,而是从申请人标签表到 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