从表中提取记录跳过其他表的记录
更好的方式来采取一个更加列儿童用户,旗(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;
谢谢,这个解决方案正在为我工作。 –
我更愿意解决这个使用针对父表的子表的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
如果父母和孩子的名字相同,该怎么办? @Tim B. – SHAZ
@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
它,因为你需要返回的输出。
需要输出的是所有记录以绿色突出显示。 –
请说明你到目前为止所尝试过的。 – Uwe