我有这个问题:
SELECT id,id1,title FROM tablename
LEFT JOIN tablename AS parent
ON tablename .id1 = parent.id
WHERE parent.id is NULL
我试图实现的是只显示没有父级的行。
表格布局和内容
id id1(parent) title
1 0 parent
2 1 child1
3 1 child2
4 100 orphan
5 1 child3
6 1 child4
在这个例子中,我会查询所有但不包括没有父行的那一行(第4行,孤儿,父表100中不存在的父100)。
答案 0 :(得分:1)
这个
SELECT child.id,child.id1,child.name
FROM table AS child --alias names, as column names would be ambiguous
LEFT JOIN table AS parent
ON table.id1 = parent.id
WHERE parent.id is NULL -- only no parent!
显示孤儿。获得所有非孤儿
SELECT child.id,child.id1,child.name
FROM table AS child
JOIN table AS parent -- JOIN takes care of getting only the records with parents
ON child.id1 = parent.id
为什么这样做? LEFT JOIN
用于连接表,我们希望接收左侧表的行,其中右侧表没有满足连接条件的记录。在这种情况下,与右侧表相关的列都将是NULL
。通过使用简单的JOIN
,只有第一个表中显示的那些行在连接的右侧表中有一条记录。
为什么会出错?
在连接表时,列名可能会变得模糊不清,并且在自联接时总是这样做...您必须使用别名来区分它们。
需要考虑的想法
可维护性。记住这一点,即使是例子。正确命名对象:table
不是描述性名称(也是关键字),请改用PERSON
。对于列,id1
不是描述性名称 - 请改用PARENT_ID
...
答案 1 :(得分:1)
您的查询看起来是正确的,除了您需要select
中的列的表别名:
SELECT table.id, table.id1, table.name
FROM table LEFT JOIN
table AS parent
ON table.id1 = parent.id
WHERE parent.id is NULL ;
问题是table
和parent
都有相同的列。没有表别名,引擎不知道你真正想要的是什么。
答案 2 :(得分:1)
我试图实现的是只显示没有父级的行。
这肯定是:
的确切对立Mysql仅选择具有现有父级的行
您问题中的查询似乎完全符合您的要求only rows are shown from which no parent exist
如果您想要与此相反,请使用内部联接并丢失where子句:
SELECT id,id1,name FROM table
INNER JOIN table AS parent
ON table.id1 = parent.id;
答案 3 :(得分:0)
尝试以下查询:
SELECT id,id1,title
FROM table
WHERE id1 IS NULL OR id1 NOT IN(SELECT id FROM table);