[英]How to exclude results based on sql condition in mysql?
我正在使用 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
的状态列jobs_applied
为“待处理”。 我想从列表中删除申请的职位。
到目前为止,我正在使用以下查询来列出作业。
SELECT * FROM jobs
我曾尝试对jobs_applied
使用INNER JOIN
,但我被困在其中。 我不知道如何将它从列表中排除。 我的会话中有student_id
。
如何创建一个查询来排除学生使用student_id
作为条件申请的工作?
您可以选择所有未在应用表中找到的工作(与您想要的学生一起)。 恕我直言,最简单的方法是使用子选择,如下所示:
SELECT * FROM jobs as j
WHERE j.job_id NOT IN (
SELECT job_id FROM jobs_applied WHERE student_id IN (<student_id>)
);
您想参考特定学生对 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 |
+--------+
您可以在下面尝试 - 使用左连接和 where 条件
SELECT a.job_id
FROM jobs a LEFT JOIN jobs_applied b ON a.job_id=b.job_id
WHERE status IS null
如果我正确理解您的问题,要保留学生尚未申请的工作清单,请使用
select * from jobs j LEFT JOIN jobs_applied ap on j.job_id=ap.jobs_id where ap.jobs_id is null
请试试这个
SELECT * FROM jobs Where Job_Id not in (Select job_id from jobs_applied where ISNULL(status,'') ='')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.