从表中提取记录跳过其他表的记录

从表中提取记录跳过其他表的记录

问题描述:

有两个表 1.家长用户 2.儿童用户从表中提取记录跳过其他表的记录

enter image description here

儿童用户表也有子女的用户的记录。 我只想输出All Childs。

+0

需要输出的是所有记录以绿色突出显示。 –

+0

请说明你到目前为止所尝试过的。 – Uwe

更好的方式来采取一个更加列儿童用户,旗(1 for parant user, 0 for child user)像:

  child users 
------------------------------------- 
| id | name | by_id | flag | 
------------------------------------- 
| 1 | x  | 1  | 1  | 
| 2 | a  | 1  | 0  | 
| 3 | b  | 1  | 0  | 
| 4 | z  | 3  | 1  | 
| 5 | c  | 3  | 0  | 
| 6 | y  | 2  | 1  | 
| 7 | d  | 2  | 0  | 
| 8 | e  | 1  | 0  | 


为了让所有的孩子词条:

SELECT id, name FROM child_users WHERE flag = 0; 
+0

谢谢,这个解决方案正在为我工​​作。 –

我更愿意解决这个使用针对父表的子表的LEFT JOIN

SELECT t1.* 
FROM ChildUsers t1 
LEFT JOIN ParentUsers t2 
    ON t1.by_id = t2.id AND 
     t1.name = t2.name 
WHERE t2.name IS NULL 

这里的窍门是WHERE条款WHERE t2.name IS NULL,这将丢弃对应于父母的任何记录。

正如@SHAZ在他的评论中指出的那样,通过使用name字段,将子项目标识为潜在父项的唯一方法是。如果不同的父母和孩子碰巧有相同的情况,那么孩子可能会被错误地从结果集中过滤掉。

演示这里:

SQLFiddle

+0

如果父母和孩子的名字相同,该怎么办? @Tim B. – SHAZ

+0

@SHAZ然后我们有一个问题。我在子表中使用'by_id'添加了一个检查,但即使父母和孩子仍然具有相同的名称,这也不是万无一失的。 –

这一个:

SELECT a.id, a.name,a.by_id from 
(select id,name,by_id from tbl_child) as a 

left JOIN 

(select id, name from tbl_parent)as b 

on a.name = b.name where b.name is null 

它,因为你需要返回的输出。