我有两张桌子:父母和学生
学生表具有父ID作为外键,学生可以具有FULL或LEFT状态。多名学生可以属于一个家长。
我需要选择只有状态为“LEFT”的学生的所有父行 - 即如果他们有两个学生,一个LEFT和一个FULL,那么这个父母将被忽略。
我尝试了一堆查询但不知道如何解决这个问题。我还想过让所有学生都成为一个查询,然后以某种方式循环结果并拉出没有任何全部学生的父母 - 但还没有成功。
任何帮助将不胜感激。
我正在使用PHP
答案 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)
一张糟糕的图表
以一种简单的方式: 您可以在子查询中单独提取“左”和“完整”,并在没有“完整”条目的情况下执行左外连接。
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