当所有子记录满足条件时,MySQL返回父级

时间:2016-11-27 19:45:18

标签: 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

我希望查询只返回父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,是否有一种简单的方法只返回父记录?

2 个答案:

答案 0 :(得分:1)

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

现在,就此问题的答案而言,可以通过以下查询来完成:

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
);

这是SQL Fiddle。 请注意,它依赖于在保存父记录时如何订购子记录的ID。

答案 1 :(得分:0)

答案刚刚来到我身边......我只需要翻转测试,所以我不需要寻找状态为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