Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果其他表中没有匹配项,则选择mySQL_Php_Mysql_Sql - Fatal编程技术网

Php 如果其他表中没有匹配项,则选择mySQL

Php 如果其他表中没有匹配项,则选择mySQL,php,mysql,sql,Php,Mysql,Sql,我有两张桌子:家长和学生 学生表将父id作为外键,学生的状态可以是FULL或LEFT。多个学生可以属于一个家长条目 我需要选择只有状态为“LEFT”的学生的所有父行,即,如果他们有两个学生,一个是LEFT,另一个是FULL,则将忽略此父行 我试过很多问题,但不知道如何解决。我还考虑过把所有的学生作为一个查询,然后以某种方式循环查询结果,把那些没有全日制学生但还没有成功的家长拉出来 任何帮助都将不胜感激 我正在使用PHP您可以使用exists和non exists只获取students表中状态为l

我有两张桌子:家长和学生

学生表将父id作为外键,学生的状态可以是FULL或LEFT。多个学生可以属于一个家长条目

我需要选择只有状态为“LEFT”的学生的所有父行,即,如果他们有两个学生,一个是LEFT,另一个是FULL,则将忽略此父行

我试过很多问题,但不知道如何解决。我还考虑过把所有的学生作为一个查询,然后以某种方式循环查询结果,把那些没有全日制学生但还没有成功的家长拉出来

任何帮助都将不胜感激


我正在使用PHP

您可以使用exists和non exists只获取students表中状态为left的家长

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上的表和
,其中
”对没有完整学生的行执行查询。类似这样(未经测试):


一张画得不好的图表

简单地说: 您可以在子查询中分别提取“left”和“full”,并在没有“full”条目的情况下执行left外部联接

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小提琴链接

查看=>感谢您的链接,这是一个展示连接工作原理的好方法。但这对如何根据列条目选择我想要的数据没有什么帮助(除非我忽略了什么?),我可以选择所有学生并将他们与家长匹配,但仍然不确定如何仅返回所有家长学生留下的数据。欢迎。看看下面给出的答案;看起来很有希望。
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;