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

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

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

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

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

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

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

myss37ts

myss37ts1#

我想

  1. SELECT *
  2. FROM foo
  3. WHERE docId = 20
  4. UNION
  5. SELECT b.*
  6. FROM foo a
  7. JOIN foo b ON a.id = b.parentId
  8. WHERE a.docId = 20

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

gopyfrb3

gopyfrb32#

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

  1. SELECT * FROM foo
  2. WHERE parentId IN (SELECT id FROM foo WHERE docId = 20)
  3. OR docId = 20
np8igboo

np8igboo3#

你可以试试工会

  1. SELECT * FROM foo a
  2. LEFT JOIN foo b ON b.id = a.parentId
  3. WHERE a.docId = 20
  4. UNION
  5. SELECT * FROM foo
  6. WHERE docId = 20
ep6jt1vc

ep6jt1vc4#

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

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

相关问题