MySQL:根据已选行中的值选择行

标签 mysql sql select join union

我想根据已选择的行中的值从我的数据库中的连接表中选择行。基本上,如果父行或祖父行处于事件状态,则还包括结果中的子行或孙行。

我曾尝试使用 JOINSUNIONS 的不同组合来获得我想要的结果,但没有成功。

这是我的示例数据:

表 1:目标 (可供成员设定为目标或完成的目标)

id   | name     | parent
---------------------------
A    | Obj A    | null 
A1   | Obj A1   | A 
A2   | Obj A2   | A
A2-1 | Obj A2.1 | A2
B    | Obj B    | null
B1   | Obj B1   | B
B1-1 | Obj B1.1 | B1
C    | Obj C    | null
C1   | Obj C1   | C
C1-1 | Obj C1.1 | C1

表 2:成员目标 (目标成员已完成或设定为目标)

id | objective | member | status
-----------------------------------
1  | A         | 001    | goal
2  | A1        | 001    | complete
3  | C         | 001    | goal

期望的结果:连接两个表并选择状态为goalcomplete 或父级或祖父级目标具有goalcomplete 的状态。

objective | member | name     | status
------------------------------------------
A         | 001    | Obj A    | goal
A1        | 001    | Obj A1   | complete
A2        | 001    | Obj A2   | null
A2-1      | 001    | Obj A2-1 | null
C         | 001    | Obj C    | goal
C1        | 001    | Obj C1   | null
C1-1      | 001    | Obj C1.1 | null

A2C2 被包括在内,因为它们的父级 AC 的状态为 goalA2-1 以及 C1-1 都包含在内,因为它们的祖 parent 的状态为 goalB 及其子目标和孙目标不包括在内,因为 memberObjectives 表中没有状态为 B完成目标

我最近的尝试如下:

SELECT DISTINCT mo.objective, mo.member, o.name, mo.status 
  FROM objectives AS o
  LEFT JOIN (SELECT * FROM memberObjectives 
    WHERE member = '001') AS mo ON o.id = mo.objective
  LEFT JOIN objectives AS o2 ON o2.id = o.parent
  LEFT JOIN objectives AS o3 ON o3.id = o2.parent 
  GROUP BY o.id

感谢您提供的任何帮助!

最佳答案

无法测试,但试试这个:

SELECT mo.objective, mo.member, o.name, mo.status 
  FROM objectives AS o
  LEFT JOIN memberObjectives o.id=mo.objetive
WHERE status='goal' or status='complete'
OR o.id IN(select parent from objetives o inner join memberObjectives mo on o.parent=mo.objetive WHERE status='goal' or status='complete')

这应该为您提供状态为 goal 或 complete 的记录,以及谁的父级拥有该记录。我不由你把它延伸到祖父。希望对您有所帮助。

关于MySQL:根据已选行中的值选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22800887/

相关文章:

mysql - 亚马逊 RDS MySQL : setting user names and passwords

sql - 基于Postgresql数据桶的分析

sql - 如何根据旧记录插入新记录并使它们不同?

sql - 按 SQL 中的计算字段进行分组

SQL - 没有键连接两个表

mysql - 在 mysql 数据库中存储跟踪应用程序的 GPS 数据的最佳实践

mysql - 使用 Docker-Compose 连接到 MariaDB 时出错, "Connection Lost: The server closed the connection"

python - 如何基于 Flask mega 教程在 pythonanywhere 上设置 Flask

php - 将 SELECT @ 变量从 SQL 发送到 PHP

mysql - 替换 MySQL 字符串中的第一个字符