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

时间:2014-02-06 17:35:47

标签: mysql sql

我已经正式头疼,抱歉只是这么说。我有一个复杂的MYSQL查询,我无法弄清楚。首先让我解释一下......我们有4个表寻求1个答案。

每个表所需的值如下

表1 - >扇区

  • ID

表2 - >分类

  • id
  • sector_id(只有父类别有这个)
  • PARENT_ID

表3 - >程序

  • ID
  • 标题

表4 - > Category_Programs

  • category_id(这些是子类别)
  • program_id

我必须选择sector_id =当前查看的扇区的所有类别。

然后找到所有带有parent_id =我们刚找到的主要类别的类别。

之后我需要从category_programs中找到所有program_ids,其中category_id =我们刚刚返回的子类别之一。

我需要的值来自id和title的程序。

我从来没有做过这样复杂的mysql查询,我完全迷失了。我目前的做法非常低效。请帮帮我。

1 个答案:

答案 0 :(得分:0)

我认为诀窍是使用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
相关问题