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