繁体   English   中英

如何根据mysql中的sql条件排除结果?

[英]How to exclude results based on sql condition in mysql?

我正在使用 Codeigniter 和 MySQL 创建一个工作申请门户。 我有以下表格:

  • 工作 - 包含工作列表
  • 学生 - 包含学生名单
  • jobs_applied - 包含学生申请的工作列表

工作

主键: job_id

列: job_idjob_name

学生们

主键: student_id

列: student_idstudent_namestudent_email

工作应用

主键: jobs_applied_id

外键: job_idstudent_id

列: job_idstudent_idstatusapplied_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM