我正在使用Codeigniter和MySQL创建工作申请门户。我有以下表格:
主键:job_id
。
列:job_id
,job_name
主键:student_id
。
列:student_id
,student_name
,student_email
主键:jobs_applied_id
。
外键:job_id
,student_id
。
列:job_id
,student_id
,status
,applied_date
在我的应用中,当用户申请工作时,我将jobs_applied
中的状态列更改为“待处理”。我想从列表中删除已应用的作业。
到目前为止,我正在使用以下查询列出工作。
SELECT * FROM jobs
我曾尝试对INNER JOIN
使用jobs_applied
,但我陷入其中。我不知道如何将其从列表中排除。我的会话中有student_id
。
如何创建查询以排除以student_id
为条件的学生申请的工作?
答案 0 :(得分:1)
您可以选择所有在应聘表格中找不到的工作(与您想要的学生一起)。 imho最简单的方法就是使用subselect,例如:
SELECT * FROM jobs as j
WHERE j.job_id NOT IN (
SELECT job_id FROM jobs_applied WHERE student_id IN (<student_id>)
);
答案 1 :(得分:1)
您想参照特定学生向Jobs_applied进行LEFT JOIN,如果没有匹配项,jobs_applied。*将为NULL,这就是您的WHERE条件。
这是一个演示:
mysql> CREATE TABLE `jobs` (
-> `job_id` int NOT NULL,
-> PRIMARY KEY (`job_id`)
-> );
mysql> INSERT INTO `jobs` VALUES (11),(22);
mysql> CREATE TABLE `students` (
-> `student_id` int NOT NULL,
-> PRIMARY KEY (`student_id`)
-> );
mysql> INSERT INTO `students` VALUES (100),(200);
mysql> CREATE TABLE `jobs_applied` (
-> `jobs_applied_id` int NOT NULL,
-> `job_id` int DEFAULT NULL,
-> `student_id` int DEFAULT NULL,
-> `status` int DEFAULT NULL,
-> PRIMARY KEY (`jobs_applied_id`),
-> KEY `job_id` (`job_id`),
-> KEY `student_id` (`student_id`),
-> CONSTRAINT `jobs_applied_ibfk_1` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`),
-> CONSTRAINT `jobs_applied_ibfk_2` FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`)
-> );
mysql> INSERT INTO `jobs_applied` VALUES (1,11,100,NULL),(2,22,200,NULL);
学生100申请了工作11,因此他应该在随后的查询中仅看到工作22。
mysql> SELECT j.*
-> FROM jobs j LEFT JOIN jobs_applied ap
-> ON j.job_id = ap.job_id AND ap.student_id = 100
-> WHERE ap.job_id IS NULL;
+--------+
| job_id |
+--------+
| 22 |
+--------+
同样,学生200申请了工作22,因此她之后只应看到工作11。
mysql> SELECT j.*
-> FROM jobs j LEFT JOIN jobs_applied ap
-> ON j.job_id = ap.job_id AND ap.student_id = 200
-> WHERE ap.job_id IS NULL;
+--------+
| job_id |
+--------+
| 11 |
+--------+
答案 2 :(得分:0)
您可以在下面尝试-使用左连接以及在何处使用条件
SELECT a.job_id
FROM jobs a LEFT JOIN jobs_applied b ON a.job_id=b.job_id
WHERE status IS null
答案 3 :(得分:0)
如果我正确理解了您的问题,要保留学生尚未申请的工作清单,请使用
select * from jobs j LEFT JOIN jobs_applied ap on j.job_id=ap.jobs_id where ap.jobs_id is null
答案 4 :(得分:0)
请尝试
SELECT * FROM jobs Where Job_Id not in (Select job_id from jobs_applied where ISNULL(status,'') ='')