2014-02-06 103 views
0

我试图解决我的嵌套查询,我有这些表:SQL:三重嵌套多对多查询

cdu_groups_blocks 
------------------------ 
|id |group_id |block_id| 
------------------------ 
|1 |1  |1  | 
|2 |1  |2  | 
|3 |1  |3  | 
------------------------ 

cdu_blocks:      cdu_blocks_sessions: 
--------------------------   --------------------------- 
|id |name  |enabled |   |id |block_id |session_id | 
--------------------------   --------------------------- 
|1 |block_1 |1  |   |1 |1  |1   | 
|2 |block_2 |1  |   |2 |1  |2   | 
|3 |block_3 |1  |   |3 |2  |3   | 
--------------------------   |4 |2  |4   | 
            |5 |3  |5   | 
            |6 |3  |6   | 
            --------------------------- 

cdu_sessions:      cdu_sessions_lessons 
--------------------------   ---------------------------- 
|id |name  |enabled |   |id |session_id |lesson_id | 
--------------------------   ---------------------------- 
|1 |session_1 |1  |   |1 |1   |1   | 
|2 |session_2 |1  |   |2 |1   |2   | 
|3 |session_3 |1  |   |3 |2   |3   | 
|4 |session_4 |0  |   |4 |4   |4   | 
|5 |session_5 |1  |   |5 |4   |5   | 
|6 |session_6 |0  |   |6 |5   |6   | 
--------------------------   ---------------------------- 

cdu_lessons: 
-------------------------- 
|id |name  |enabled | 
-------------------------- 
|1 |lesson_1 |1  | 
|2 |lesson_2 |1  | 
|3 |lesson_3 |1  | 
|4 |lesson_4 |1  | 
|5 |lesson_5 |0  | 
|6 |lesson_6 |0  | 
-------------------------- 

这是一个多到许多可链接到其他许多一对多链接到另一个多对多。

本质上我想获得与特定group_id相关的所有lesson_id(s)。

到目前为止,我有这一点,但它抛出了各种SQL错误:

SELECT b.* FROM 
(
    SELECT block_id, group_id FROM cdu_groups_blocks 
    JOIN cdu_blocks ON cdu_blocks.id = cdu_groups_blocks.block_id 
    WHERE group_id = $group_id 
    AND enabled = 1 
) AS b 
INNER JOIN 
(
    SELECT l.* FROM 
    (
     SELECT session_id, block_id FROM cdu_blocks_sessions 
     JOIN cdu_sessions ON cdu_sessions.id = cdu_blocks_sessions.session_id 
     AND enabled = 1 
) AS s 
INNER JOIN 
(
    SELECT lesson_id, session_id FROM cdu_sessions_lessons 
    JOIN cdu_lessons ON cdu_lessons.id = cdu_sessions_lessons.lesson_id 
    WHERE enabled = 1 
) AS l 
WHERE s.session_id = l.session_id 
) AS sl 
WHERE sl.block_id = g.block_id 

任何帮助,将不胜感激!

+0

这不是预言,我猜。你能发布一些错误吗? –

+0

'where子句'中的未知列'sl.block_id' – user3241112

+0

加上g.block_id – wildplasser

回答

0

sl.block_id小号表中的第一选择内部SL子查询中。

只是明白了。变化:

SELECT l.* FROM ... 

SELECT l.*, s.block_id FROM ... 
+0

的相同内容欢迎您 –