Как получить записи таблицы базы данных, где определенный столбец не связан с определенным значением другой таблицей? - PullRequest
1 голос
/ 12 июня 2019

У меня есть база данных со следующими таблицами: Студенты, Классы, link_student_class.Где Студенты содержат информацию о зарегистрированных студентах, а классы содержат информацию о классах.Поскольку каждый ученик может посещать несколько классов, и каждый класс может посещать несколько учеников, я добавил таблицу связей для сопоставления учеников и классов.

Linking-Table

id | student_id | class_id
1    1            1
2    1            2
3    2            1
4    3            3

В этой таблице и student_id, и class_id будут появляться несколько раз!Что я ищу, так это SQL-Query, который возвращает информацию обо всех учениках (например, в «SELECT * FROM учеников»), которые не посещают определенный класс (заданный его идентификатором).

Я пыталсяследующий SQL-запрос

SELECT * FROM `students` 
LEFT JOIN(
    SELECT * FROM link_student_class
    WHERE class_id = $class_id
    )
link_student_class ON link_student_class.student_id = students.student_id

, где $ class_id - это идентификатор класса, учеников которого я хочу исключить.

В возвращаемом объекте ученики, которых я хочу включить, и те, кого я хочудля исключения различаются по значению столбца «class_id».Те, которые должны быть включены, имеют значение «NULL», тогда как те, которые я хочу исключить, имеют числовое значение.

Ответы [ 3 ]

1 голос
/ 12 июня 2019

NOT EXISTS приходит на ум:

select s.*
from students s
where not exists (select 1
                  from link_student_class lsc
                  where lsc.student_id = s.student_id and
                        lsc.class_id = ?
                 );

? является заполнителем для параметра, предоставляющего класс.

0 голосов
/ 12 июня 2019

Или также предикат NOT IN:

WITH
stud_class(id,stud_id,class_id) AS (
          SELECT 1,   1,1
UNION ALL SELECT 2,   1,2
UNION ALL SELECT 3,   2,1
UNION ALL SELECT 4,   3,3
)
,
stud(stud_id,fname,lname) AS (
          SELECT 1,'Arthur','Dent'
UNION ALL SELECT 2,'Ford','Prefect'
UNION ALL SELECT 3,'Tricia','McMillan'
UNION ALL SELECT 4,'Zaphod','Beeblebrox'
)
SELECT 
  s.*
FROM stud s
WHERE stud_id NOT IN (
  SELECT
    stud_id
  FROM stud_class
  WHERE class_id= 2
);
-- out  stud_id | fname  |   lname    
-- out ---------+--------+------------
-- out        3 | Tricia | McMillan
-- out        4 | Zaphod | Beeblebrox
-- out        2 | Ford   | Prefect
-- out (3 rows)
-- out 
-- out Time: First fetch (3 rows): 9.516 ms. All rows formatted: 9.550 ms
0 голосов
/ 12 июня 2019

вы должны проверить NULL link_student_class.student_id

SELECT * 
FROM `students` 
LEFT JOIN(
    SELECT * 
    FROM link_student_class
    WHERE class_id = $class_id
) link_student_class ON link_student_class.student_id = students.student_id
where link_student_class.student_id  is null 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...