我有一个具有以下结构的表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
的行相对应的parentId来选择所有内容。
我以为我会使用LEFT JOIN到达那里,但是没有运气:
SELECT * FROM foo a
LEFT JOIN foo b ON b.id = a.parentId
WHERE a.docId = 20
这将返回docId = 20
处的所有行,而不返回docId = NULL
和parentId是docId为20的行。
答案 0 :(得分:1)
您可以尝试工会
SELECT * FROM foo a
LEFT JOIN foo b ON b.id = a.parentId
WHERE a.docId = 20
UNION
SELECT * FROM foo
WHERE docId = 20
答案 1 :(得分:1)
我认为您的加入规则有误,
我相信您必须使用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
答案 2 :(得分:0)
我使用子查询而不是JOIN来解决它:
SELECT * FROM foo
WHERE parentId IN (SELECT id FROM foo WHERE docId = 20)
OR docId = 20
答案 3 :(得分:0)
我认为
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。