mysql - 复杂的 MYSQL 查询 4 ​​个表寻找 1 个结果

标签 mysql sql

我真的很头疼,抱歉不得不这么说。我有一个我无法理解的复杂 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

或者,您可以将其分解为两个查询,这样就不需要 ORDISTINCT,实际上可能会提高性能:

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/

相关文章:

sql - 我怎样才能让一个表 "overrides"另一个?

PHP mysql 按品种分隔结果集

php - 当尝试在页面的两个部分中使用 PHP 时,为什么会出现 undefined variable 错误?

c# - 使用 C# 检查用户是否已存在于 MySql 数据库中

php - 如何对表示具有多个答案的民意调查的两个表使用一个查询?

sql - 如何在SQL中选择具有特定列计数的表中的所有列?

mysql - 子查询使用 JOINS 返回多于 1 行的问题

mySQL,将结果值设置为同一查询中的另一个值

c# - 替代 Group_Concat 以自定义现有 Entity Framework 模型

.net - 在 SqlCommand 上传递参数不起作用