参照同一表中的其他行选择行

r6hnlfcb  于 2021-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(546)

我有一张table foo 具有以下结构:

| id | docId  | content | parentId |
|----|--------|---------|----------|
| 1  | 19     | ...     | NULL     |
| 2  | 20     | ...     | NULL     |
| 3  | 20     | ...     | NULL     |
| 4  | NULL   | ...     | 3        |
| 5  | 20     | ...     | NULL     |
| 6  | NULL   | ...     | 5        |
| 7  | 21     | ...     | NULL     |
| 8  | NULL   | ...     | 7        |
| 9  | NULL   | ...     | 7        |

我想选择一切与 docId = 20 ,或具有与具有 docId = 20 .
我以为我会用左连接到达那里,但运气不好:

SELECT * FROM foo a
LEFT JOIN foo b ON b.id = a.parentId
WHERE a.docId = 20

这将返回 docId = 20 但不是那些 docId = NULL parentid是docid为20的行。

myss37ts

myss37ts1#

我想

SELECT * 
    FROM foo
    WHERE docId = 20
    UNION
    SELECT b.* 
    FROM foo a
    JOIN foo b ON a.id = b.parentId
    WHERE a.docId = 20

回答你关于父母的问题,如果你想要祖父母和其他祖先,你可以考虑递归CTE。

gopyfrb3

gopyfrb32#

我用子查询而不是联接解决了这个问题:

SELECT * FROM foo
WHERE parentId IN (SELECT id FROM foo WHERE docId = 20)
OR docId = 20
np8igboo

np8igboo3#

你可以试试工会

SELECT * FROM foo a
LEFT JOIN foo b ON b.id = a.parentId
WHERE a.docId = 20    
UNION 
SELECT * FROM foo
WHERE docId = 20
ep6jt1vc

ep6jt1vc4#

我认为你的加入规则有错误,
我相信你必须使用 a.id = b.parentId 不是 b.id = a.parentId ,例如:

SELECT * FROM foo a
LEFT JOIN foo b ON a.id = b.parentId
WHERE a.docId = 20

相关问题