我真的很头疼,抱歉不得不这么说。我有一个我无法理解的复杂 MYSQL 查询。首先让我解释一下......我们有 4 个表寻求 1 个答案。
每个表需要的值如下
表 1 -> 部门
- 编号
表 2 -> 类别
- 编号
- sector_id(只有父类别有这个)
- parent_id
表 3 -> 程序
- 编号
- 标题
表 4 -> Category_Programs
- category_id(这些是子类别)
- 程序编号
一些我必须选择所有类别的方法,其中 sector_id = 当前查看的扇区。
然后找到所有具有 parent_id = 我们刚刚找到的主要类别的类别。
之后,我需要从 category_programs 中找到所有 program_id,其中 category_id = 我们刚刚返回的子类别之一。
我需要的值来自程序,即 id 和 title。
我从来没有做过像这样复杂的 mysql 查询,我完全迷路了。我目前这样做的方式效率很低。请帮助我。
最佳答案
我认为诀窍是使用 Categories
两次,一次在 LEFT JOIN
中。
SELECT p.id, p.title
FROM Categories c1
LEFT JOIN Categories c2
ON c2.parent_id = c1.id
JOIN Category_Programs cp
ON cp.category_id = c1.id OR cp.category_id = c2.id
JOIN Programs p
ON p.id = cp.program_id
WHERE c1.sector_id = 1
我认为如果您有一个以上的子类别用于特定父项,您可能会从 OR
中获得重复项,因此您可能想要添加 DISTINCT
。
或者,您可以将其分解为两个查询,这样就不需要 OR
和 DISTINCT
,实际上可能会提高性能:
SELECT p.id, p.title
FROM Categories c1
JOIN Category_Programs cp
ON cp.category_id = c1.id
JOIN Programs p
ON p.id = cp.program_id
WHERE c1.sector_id = 1
UNION
SELECT p.id, p.title
FROM Categories c1
JOIN Categories c2
ON c2.parent_id = c1.id
JOIN Category_Programs cp
ON cp.category_id = c2.id
JOIN Programs p
ON p.id = cp.program_id
WHERE c1.sector_id = 1
关于mysql - 复杂的 MYSQL 查询 4 个表寻找 1 个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21610020/