mySQL如果在其他表中没有匹配则选择

时间:2014-09-23 03:31:17

标签: php mysql sql

我有两张桌子:父母和学生

学生表具有父ID作为外键,学生可以具有FULL或LEFT状态。多名学生可以属于一个家长。

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

我尝试了一堆查询但不知道如何解决这个问题。我还想过让所有学生都成为一个查询,然后以某种方式循环结果并拉出没有任何全部学生的父母 - 但还没有成功。

任何帮助将不胜感激。

我正在使用PHP

3 个答案:

答案 0 :(得分:0)

您可以使用exists和non exists来仅获取学生表中具有左侧状态的父级。

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
             )

答案 1 :(得分: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

答案 2 :(得分: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