简体   繁体   中英

SQL: Nested select query?

Anyone know how I can combine these in to one statement? It's the lesson_id(s) for ALL sessions from a specific block that I'm after...

$query = "
SELECT session_id FROM cdu_blocks_sessions
JOIN cdu_sessions ON cdu_sessions.id = cdu_blocks_sessions.session_id
WHERE block_id = $block_id
AND enabled = 1";

$session_ids = cdu_get_query_results($db, $query, __LINE__);

$lesson_ids = array();

foreach ($session_ids as $session_id) {
    $query = "
    SELECT lesson_id FROM cdu_sessions_lessons
    JOIN cdu_lessons ON cdu_lessons.id = cdu_sessions_lessons.lesson_id
    WHERE session_id = " . $session_id['session_id'] . "
    AND enabled = 1";

    $lesson_ids = array_merge($lesson_ids, cdu_get_query_results($db, $query, __LINE__));
}

cdu_sessions:

------------------------------
|id |name           |enabled |
------------------------------
|1  |session 1      |1       |
|2  |session 2      |1       |
|3  |session 3      |1       |
|4  |session 4      |0       |
|5  |session 5      |1       |
|6  |session 6      |0       |
|7  |session 7      |1       |
|8  |session 8      |1       |
------------------------------

cdu_blocks_sessions:

---------------------------
|id |block_id |session_id |
---------------------------
|1  |1        |1          |
|1  |1        |2          |
|1  |1        |3          |
|1  |2        |4          |
|1  |2        |5          |
|1  |2        |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       |
-----------------------------

cdu_sessions_lessons:

----------------------------
|id |session_id |lesson_id |
----------------------------
|1  |1          |1         |
|1  |1          |2         |
|1  |1          |3         |
|1  |2          |4         |
|1  |2          |5         |
----------------------------

Try this query for SQL Server

SELECT *
FROM (
SELECT session_id FROM cdu_blocks_sessions
JOIN cdu_sessions ON cdu_sessions.id = cdu_blocks_sessions.session_id
WHERE block_id = $block_id
AND enabled = 1
) S
CROSS APPLY (
SELECT lesson_id FROM cdu_sessions_lessons
    JOIN cdu_lessons ON cdu_lessons.id = cdu_sessions_lessons.lesson_id
    WHERE session_id = S.session_id
    AND enabled = 1
) L

More on cross apply

SQL Server CROSS APPLY and OUTER APPLY

Another way

    SELECT L.*
    FROM (
    SELECT session_id FROM cdu_blocks_sessions
    JOIN cdu_sessions ON cdu_sessions.id = cdu_blocks_sessions.session_id
    WHERE block_id = $block_id
    AND enabled = 1
    ) 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
    ) L S.session_id = L.session_id

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM