Mysql只选择具有现有父级的行

时间:2013-09-13 11:24:48

标签: 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              child1
3     1              child2
4     100            orphan
5     1              child3
6     1              child4

在这个例子中,我会查询所有但不包括没有父行的那一行(第4行,孤儿,父表100中不存在的父100)。

4 个答案:

答案 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 ;

问题是tableparent都有相同的列。没有表别名,引擎不知道你真正想要的是什么。

答案 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);