我已经正式头疼,抱歉只是这么说。我有一个复杂的MYSQL查询,我无法弄清楚。首先让我解释一下......我们有4个表寻求1个答案。
每个表所需的值如下
表1 - >扇区
表2 - >分类
表3 - >程序
表4 - > Category_Programs
我必须选择sector_id =当前查看的扇区的所有类别。
然后找到所有带有parent_id =我们刚找到的主要类别的类别。
之后我需要从category_programs中找到所有program_ids,其中category_id =我们刚刚返回的子类别之一。
我需要的值来自id和title的程序。
我从来没有做过这样复杂的mysql查询,我完全迷失了。我目前的做法非常低效。请帮帮我。
答案 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
。
或者,您可以将其细分为两个查询,这些查询将取消对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