mysql - 选择所有 child 都满足条件的 self 关系中的行

标签 mysql sql join tree self-join

我正在使用具有以下字段的单个表(称为 documents):idparent_idstatusparent_id 字段引用同一张表中的id 字段。 status 字段的类型为 ENUM('submitted', 'accepted', 'rejected')

我想选择所有 documents no children where status = 'accepted'

我的第一次尝试是这样的:

SELECT DISTINCT `documents`.*
FROM (`documents`)
LEFT OUTER JOIN `documents` children_documents
  ON `documents`.`id` = `children_documents`.`parent_id`
WHERE `children_documents`.`id` IS NULL
  OR `children_documents`.`status` != 'accepted'

问题在于,仍会选择包含已接受和未接受子项的文档。不应选择包含任何已接受子项的文档。

我感觉 GROUP BY 可能是我的 friend ,但我不知道如何使用它来获得预期的结果。

最佳答案

SELECT DISTINCT `documents`.*
FROM (`documents`)
LEFT OUTER JOIN `documents` children_documents
  ON `documents`.`id` = `children_documents`.`parent_id`
  AND `children_documents`.`status` = 'accepted'
WHERE `children_documents`.`parent_id` IS NULL

关于mysql - 选择所有 child 都满足条件的 self 关系中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12082353/

相关文章:

php - 对两个准备好的语句使用相同的 MySql 连接

php - 插入如何进行多对多查询 "OR"两个表

php - 通过 PHP 连接 mysql 表来处理多行

c# - MySQL Split 在 "SELECT WHERE IN"语句中使用

mysql - mysql查询错误,不返回MIN值

mysql - 如何优化这些 SQL 查询?

mysql - 从连接中具有多个 id 的一张表中获取名称

mysql - Docker mysql 数据不反射(reflect)变化

mysql - 删除数据库表

mysql如何仅在新值低于现有值时更新字段