Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql仅选择具有现有父级的行_Mysql_Sql_Subquery_Left Join - Fatal编程技术网

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..好建议!忘了!好建议!忘了!这篇文章通过解释我的问题对我帮助很大。非常感谢你提出的清晰易懂的建议。这一条通过解释我的问题帮助了我很多。非常感谢您提出的清晰易懂的建议。