2014-09-23 2 views
0

У меня есть две таблицы: Родитель и StudentMySql Выберите, если нет совпадений в другой таблице

таблица студент имеет родительский идентификатор в качестве внешнего ключа, студент не может иметь статус полной или ВЛЕВО. Несколько учеников могут принадлежать одной родительской записи.

Мне нужно выбрать все родительские строки, в которых есть ТОЛЬКО учащиеся, имеющие статус «ВЛЕВО», то есть если у них есть два ученика, один ЛЕВЫЙ и один ПОЛНЫЙ, то этот родитель будет проигнорирован.

Я пробовал кучу запросов и т. Д., Но не уверен, как справиться с этим. Я также подумал о том, чтобы все учащиеся были в качестве запроса, а затем каким-то образом перебирали результат и вытаскивали родителей, у которых нет никаких ПОЛНЫХ студентов, - но пока этого не удалось.

Любая помощь будет оценена по достоинству.

Я использую PHP

+1

Взгляните => [** Визуальное представление SQL JOINS **] (http://www.codeproject.com/Articles/33052/Visual-Representation -of-SQL-Joins) –

+0

Спасибо за ссылку, это отличный способ показать, как работают соединения. Но на самом деле это не помогает, как выбирать данные, которые я хочу, на основе ввода столбца (если я не замечаю что-то?) Я могу выбрать всех учеников и сопоставить их с родителями, но я все еще не уверен, как возвращать данные где все родители уехали – Pedro

+0

Добро пожаловать. Взгляните на ответ, который приведен ниже; это выглядит многообещающим. –

ответ

0

вы можете использовать существует и не существует, чтобы принести только родитель с левым положением в таблице студентов.

select * from parent p 
where exists (select 1 from student s 
       where s.status ='LEFT' 
       and s.parent_id = p.id 
      ) 
and not exists (select 1 from student s 
       where s.status ='FULL' 
       and s.parent_id = p.id 
      ) 
0

Я хотел бы предложить соединения таблиц на родительском Ид и where «ИНГ запрос на строки с нулевыми полными студентами. Что-то вроде этого (непроверенные):

SELECT [...] FROM parent LEFT JOIN student ON parent.id = student.pid 
WHERE SUM(CASE WHEN student.status = 'full' THEN 1 ELSE 0 END) = 0 
0

Один плохо обращается схема

enter image description here

В простой способ: Вы можете извлечь «левый» и «полной» отдельно в подзапрос и сделать левое внешнее соединение без «полной» записи.

SELECT t1.p_id 
    ,t1.STATUS 
FROM (
    (
     SELECT p_id 
      ,STATUS 
     FROM student 
     WHERE STATUS = 'left' 
     ) t1 LEFT OUTER JOIN (
     SELECT p_id 
      ,STATUS 
     FROM student 
     WHERE STATUS = 'full' 
     ) t2 ON t1.p_id = t2.p_id 
    ) 
WHERE t2.p_id IS NULL 
GROUP BY t1.p_id 
    ,t1.STATUS; 

SQL Скрипки ссылка http://sqlfiddle.com/#!2/f4249c/6

Смежные вопросы