Mysql仅选择具有现有父级的行
我有一个疑问:Mysql仅选择具有现有父级的行,mysql,sql,subquery,left-join,Mysql,Sql,Subquery,Left Join,我有一个疑问: 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
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行,孤立行,tablename中不存在的父100)。
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
。通过使用简单的联接
,仅显示第一个表中的行,这些行在联接右侧的表中有记录
你为什么会得到错误的结果
id id1(parent) title
1 0 parent
2 1 child1
3 1 child2
4 100 orphan
5 1 child3
6 1 child4
列名在连接表时可能变得模棱两可,并且在自连接时总是如此。。。您必须使用别名来区分它们
需要考虑的想法
可维护性。记住这一点,即使是举个例子。正确命名对象:table
不是描述性名称(也是关键字),请使用PERSON
。对于列,id1
不是描述性名称-请使用PARENT\u ID
代替…
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
。通过使用简单的联接
,仅显示第一个表中的行,这些行在联接右侧的表中有记录
你为什么会得到错误的结果
id id1(parent) title
1 0 parent
2 1 child1
3 1 child2
4 100 orphan
5 1 child3
6 1 child4
列名在连接表时可能变得模棱两可,并且在自连接时总是如此。。。您必须使用别名来区分它们
需要考虑的想法
可维护性。记住这一点,即使是举个例子。正确命名对象:
table
不是描述性名称(也是关键字),请使用PERSON
。对于列,id1
不是描述性名称-请改用PARENT\u ID
。您的查询看起来是正确的,除非您需要选择中列的表别名:
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
都有相同的列。如果没有表别名,引擎不知道您真正想要的是哪一个。您的查询看起来是正确的,除非您需要选择中的列的表别名:
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
都有相同的列。如果没有表别名,引擎不知道您真正想要哪个
我试图实现的是,只显示不存在父级的行
当然,这与:
Mysql仅选择具有现有父级的行
您问题中的查询似乎完全符合您的要求仅显示不存在父项的行
如果希望与此相反,请使用内部联接并丢失where子句:
SELECT id,id1,name FROM table
INNER JOIN table AS parent
ON table.id1 = parent.id;
我试图实现的是,只显示不存在父级的行
当然,这与:
Mysql仅选择具有现有父级的行
您问题中的查询似乎完全符合您的要求仅显示不存在父项的行
如果希望与此相反,请使用内部联接并丢失where子句:
SELECT id,id1,name FROM table
INNER JOIN table AS parent
ON table.id1 = parent.id;
请尝试以下查询:
SELECT id,id1,title
FROM table
WHERE id1 IS NULL OR id1 NOT IN(SELECT id FROM table);
请尝试以下查询:
SELECT id,id1,title
FROM table
WHERE id1 IS NULL OR id1 NOT IN(SELECT id FROM table);
它确实有一个父母。孤立行的父记录的id为100。这应该是NULL
。此外,namings的情况也很糟糕。使用table
作为表名(受限制的词)特别烦人……table是一个假名,当然不是真名,我改变了问题,使其更清楚。您的意思是所有具有id1的行都是空的,或者如果id1具有其他值,则该值不作为id存在于表中?您的查询工作正常。我想你的数据是错的。因为您正在匹配父ID。它确实有一个父ID。孤立行的父记录的id为100。这应该是NULL
。此外,namings的情况也很糟糕。使用table
作为表名(受限制的词)特别烦人……table是一个假名,当然不是真名,我改变了问题,使其更清楚。您的意思是所有具有id1的行都是空的,或者如果id1具有其他值,则该值不作为id存在于表中?您的查询工作正常。我想你的数据是错的。因为您正在匹配父ID..好建议!忘了!好建议!忘了!这篇文章通过解释我的问题对我帮助很大。非常感谢你提出的清晰易懂的建议。这一条通过解释我的问题帮助了我很多。非常感谢您提出的清晰易懂的建议。