【问题标题】:How to exclude results based on sql condition in mysql?如何根据mysql中的sql条件排除结果?
【发布时间】:2019-03-04 12:54:12
【问题描述】:

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

  • jobs - 包含作业列表
  • students - 包含学生列表
  • jobs_applied - 包含学生申请的职位列表

工作

主键:job_id

列:job_idjob_name

学生

主键:student_id

列:student_idstudent_namestudent_email

jobs_applied

主键:jobs_applied_id

外键:job_idstudent_id

列:job_idstudent_idstatusapplied_date

在我的应用程序中,当用户申请工作时,我将jobs_applied 中的状态列更改为“待定”。我想从列表中删除申请的职位。

到目前为止,我正在使用以下查询来列出工作。

SELECT * FROM jobs

我曾尝试使用INNER JOIN 对抗jobs_applied,但我被困在其中。我不知道如何从列表中排除它。我的会话中有student_id

如何以student_id为条件创建排除学生申请的工作的查询?

【问题讨论】:

    标签: mysql sql codeigniter


    【解决方案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】:

      您可以选择所有未在申请表中找到的工作(与您想要的学生一起)。恕我直言,最简单的方法是使用子选择,如下所示:

      SELECT * FROM jobs as j
      WHERE j.job_id NOT IN (
       SELECT job_id FROM jobs_applied WHERE student_id IN (<student_id>)
      );
      

      【讨论】:

        【解决方案3】:

        您可以在下面尝试 - 使用左连接和 where 条件

          SELECT a.job_id
          FROM jobs a LEFT JOIN jobs_applied b ON a.job_id=b.job_id
          WHERE status IS null
        

        【讨论】:

        • 我想显示除了用户已经申请的工作之外的工作列表。在您的查询中没有student_id
        • 您能否以表格格式添加一些示例数据和您的预期输出 - 然后很容易理解您想要什么@BearNithi
        • 如何创建一个查询,排除学生使用student_id作为条件申请的工作?对不起,我不知道如何创建有问题的表格视图
        【解决方案4】:

        请试试这个

        SELECT * FROM jobs Where Job_Id not in (Select job_id from jobs_applied where ISNULL(status,'') ='') 
        

        【讨论】:

        • 我想显示除学生已经申请的工作之外的工作列表。在您的查询中没有student_id
        【解决方案5】:

        如果我正确理解了您的问题,要保留学生未申请的工作列表,请使用

        select * from jobs j LEFT JOIN jobs_applied ap on j.job_id=ap.jobs_id where ap.jobs_id is null
        

        【讨论】:

        • 我想显示除学生已经申请的工作之外的工作列表。在您的查询中没有student_id
        • 你有工作的student_id吗?您能否列出您的表 jobs、students 和 jobs_applied 中的所有列?
        猜你喜欢
        • 2016-10-11
        • 2021-10-21
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多