0

我有这个查询:

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,表名中不存在)。

4

4 回答 4

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如此。通过使用 simple JOIN,仅显示第一个表中的那些行,这些行在连接右侧的表中具有记录。

为什么你得到错误的结果

连接表时列名可能会变得不明确,并且在自连接时总是这样做......您必须通过使用别名来区分它们。

要考虑的想法

可维护性。请记住这一点,即使是示例。正确命名您的对象:table不是描述性名称(也是关键字),请PERSON改用。对于列,id1不是描述性名称 -PARENT_ID改为使用...

于 2013-09-13T11:30:35.553 回答
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相同的列。如果没有表别名,引擎不知道您真正想要哪个。

于 2013-09-13T11:31:05.193 回答
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; 
于 2013-09-13T11:34:28.363 回答
0

尝试以下查询:

SELECT id,id1,title
FROM table 
WHERE id1 IS NULL OR id1 NOT IN(SELECT id FROM table);
于 2013-09-13T11:36:46.107 回答