2014-09-23 97 views
0

我有两个表:家长和学生MySQL的选择,如果在其他表中没有匹配

学生表有父ID作为外键,一个学生可以有状态FULL或左侧。多个学生可以属于一个家长条目。

我需要选择所有只有学生具有“左”状态的父行 - 即如果他们有两个学生,一个左和一个满,那么这个家长将被忽略。

我试过一堆查询等,但不知道如何解决这个问题。我也考虑过让所有学生作为一个查询,然后以某种方式循环查看结果,并抽出没有任何FULL学生的家长 - 但还没有成功。

任何帮助,将不胜感激。

我使用PHP

+1

看一看=> [** SQL的可视化表示加入**](http://www.codeproject.com/Articles/33052/Visual-Representation -SQL-Joins) – 2014-09-23 03:33:40

+0

感谢您的链接,这是一个很好的方式来展示如何加入工作。但是,它并没有真正帮助我如何根据列条目选择我想要的数据(除非我忽略了某些内容?)我可以选择所有学生并将它们与父母进行匹配,但仍然不确定如何仅返回数据所有的家长学生都离开了 – Pedro 2014-09-23 03:44:17

+0

不客气。看看下面给出的答案;它看起来有希望。 – 2014-09-23 03:50:23

回答

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

我建议对荷兰国际集团与零点满生行查询父ID和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

相关问题