我有两个表:家长和学生MySQL的选择,如果在其他表中没有匹配
学生表有父ID作为外键,一个学生可以有状态FULL或左侧。多个学生可以属于一个家长条目。
我需要选择所有只有学生具有“左”状态的父行 - 即如果他们有两个学生,一个左和一个满,那么这个家长将被忽略。
我试过一堆查询等,但不知道如何解决这个问题。我也考虑过让所有学生作为一个查询,然后以某种方式循环查看结果,并抽出没有任何FULL学生的家长 - 但还没有成功。
任何帮助,将不胜感激。
我使用PHP
我有两个表:家长和学生MySQL的选择,如果在其他表中没有匹配
学生表有父ID作为外键,一个学生可以有状态FULL或左侧。多个学生可以属于一个家长条目。
我需要选择所有只有学生具有“左”状态的父行 - 即如果他们有两个学生,一个左和一个满,那么这个家长将被忽略。
我试过一堆查询等,但不知道如何解决这个问题。我也考虑过让所有学生作为一个查询,然后以某种方式循环查看结果,并抽出没有任何FULL学生的家长 - 但还没有成功。
任何帮助,将不胜感激。
我使用PHP
你可以使用存在和不存在与学生表左侧状态获取只有父母。
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
)
我建议对荷兰国际集团与零点满生行查询父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
一画不好图
在一个简单的方法: 您可以在子查询中提取“左”和“全”分开,做没有“完整”条目的左外连接。
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
看一看=> [** SQL的可视化表示加入**](http://www.codeproject.com/Articles/33052/Visual-Representation -SQL-Joins) – 2014-09-23 03:33:40
感谢您的链接,这是一个很好的方式来展示如何加入工作。但是,它并没有真正帮助我如何根据列条目选择我想要的数据(除非我忽略了某些内容?)我可以选择所有学生并将它们与父母进行匹配,但仍然不确定如何仅返回数据所有的家长学生都离开了 – Pedro 2014-09-23 03:44:17
不客气。看看下面给出的答案;它看起来有希望。 – 2014-09-23 03:50:23