Как исключить результаты, основанные на условии SQL в MySQL? - PullRequest
0 голосов
/ 04 марта 2019

Я создаю портал приложения для работы, используя Codeigniter и MySQL.У меня есть следующие таблицы:

  • заданий - который содержит список заданий
  • студентов - который содержит список учеников
  • jobs_applied - который содержит прикладные заданиясписок по студентам

вакансии

первичный ключ: job_id.

столбцы: job_id, job_name

студенты

первичный ключ: student_id.

столбцы: student_id, student_name, student_email

jobs_applied

первичный ключ: 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 в качестве условия?

Ответы [ 5 ]

0 голосов
/ 04 марта 2019

Вы хотите выполнить LEFT JOIN to jobs_applied со ссылкой на конкретного учащегося, и там, где нет совпадения, 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 |
+--------+
0 голосов
/ 04 марта 2019

Вы можете выбрать все работы, которые не найдены в прикладной таблице (с вашим желаемым учеником).Самый простой способ imho с помощью подвыбора, например:

SELECT * FROM jobs as j
WHERE j.job_id NOT IN (
 SELECT job_id FROM jobs_applied WHERE student_id IN (<student_id>)
);
0 голосов
/ 04 марта 2019

Если я правильно понял ваш вопрос, чтобы сохранить список вакансий, на которые студент не претендовал, введите

select * from jobs j LEFT JOIN jobs_applied ap on j.job_id=ap.jobs_id where ap.jobs_id is null
0 голосов
/ 04 марта 2019

Пожалуйста, попробуйте это

SELECT * FROM jobs Where Job_Id not in (Select job_id from jobs_applied where ISNULL(status,'') ='') 
0 голосов
/ 04 марта 2019

Вы можете попробовать ниже - используйте левое соединение и где условие

  SELECT a.job_id
  FROM jobs a LEFT JOIN jobs_applied b ON a.job_id=b.job_id
  WHERE status IS null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...