Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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
MySQL在所有子记录满足条件时返回父记录_Mysql - Fatal编程技术网

MySQL在所有子记录满足条件时返回父记录

MySQL在所有子记录满足条件时返回父记录,mysql,Mysql,我有一个MySQL语句几乎可以工作了。我只需要一个调整,让它充分发挥作用,但我不知道如何做到这一点 我希望返回父表中具有子记录的所有行,但前提是所有子状态均为1。子ID位于父表上的单个逗号分隔字段中 这是我的桌子的样子 parent ID IDS 1 1001,1003,1004 2 1003, 1005 child ID STATUS 1001 1 1003 1 1004 0 1005 1

我有一个MySQL语句几乎可以工作了。我只需要一个调整,让它充分发挥作用,但我不知道如何做到这一点

我希望返回父表中具有子记录的所有行,但前提是所有子状态均为1。子ID位于父表上的单个逗号分隔字段中

这是我的桌子的样子

parent
    ID    IDS
    1     1001,1003,1004 
    2     1003, 1005

child
    ID    STATUS
    1001  1
    1003  1
    1004  0
    1005  1
我希望查询只返回父ID 2,因为子记录1003和1005都是状态1。我不希望返回父ID 1,因为子记录1004状态为0

这是我目前使用的SQL,它错误地返回了两个父记录。我认为这样做是因为如果任何子记录的状态为1,它将返回父记录

SELECT * 
FROM parent p
INNER JOIN child c ON c.id IN (p.ids) AND c.status = 1
GROUP BY p.id

如果所有子记录都是状态1,是否有一种简单的方法只返回父记录?

我刚刚找到了答案…我只需要翻到测试,所以我不需要查找状态为1的子记录,而需要查找状态为0的子记录

SELECT * 
FROM parent p
WHERE NOT EXISTS (SELECT * from child c WHERE c.id in (p.ids) and c.status = 0)
GROUP BY p.id

我刚刚得到了答案…我只需要切换到测试,所以我不需要查找状态为1的子记录,而需要查找状态为0的子记录

SELECT * 
FROM parent p
WHERE NOT EXISTS (SELECT * from child c WHERE c.id in (p.ids) and c.status = 0)
GROUP BY p.id

首先,这不是一个好的设计。您应该在另一个表中存储一对多关系

现在,就回答这个问题而言,可以通过以下查询完成:

select p.id
from parent p
where p.ids in (
    select group_concat(id) 
    from child 
    where p.ids like CONCAT('%', id, '%')
    and status = 1
    group by p.id
);
给你。
请注意,这取决于父记录保存时子记录ID的排序方式。

首先,这不是一个好的设计。您应该在另一个表中存储一对多关系

现在,就回答这个问题而言,可以通过以下查询完成:

select p.id
from parent p
where p.ids in (
    select group_concat(id) 
    from child 
    where p.ids like CONCAT('%', id, '%')
    and status = 1
    group by p.id
);
给你。
请注意,这取决于父记录保存时子记录ID的排序方式。

谢谢Darshan。不过我更喜欢我的SQL,因为它对我来说更干净!我接受你关于一对多关系的观点,但恐怕这就是表的设计方式,所以我必须使用它:(谢谢Darshan。我更喜欢我的SQL,因为它对我来说似乎更干净!我接受你关于一对多关系的观点,但恐怕这就是表的设计方式,所以我必须使用它:(