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

时间:2018-09-12 11:43:57

标签: mysql join

我有一个具有以下结构的表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的行。

4 个答案:

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