2016-11-27 65 views
-1

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

回答

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 
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。

+0

谢谢Darshan。我更喜欢我的SQL,因为它对我来说似乎更清洁!我关于一对多关系的观点很重要,但这就是桌子的设计方式,所以我只需要使用它:( – Damian

相关问题