简体   繁体   中英

Simple SQL join query (I think)

Can anyone tell me why I get the error: Unknown column 'cdu_user_progress.uid' in 'where clause' when I use FULL JOIN, but not when I just use JOIN? I'm using MySQL...

SELECT 
    cdu_lessons.*, 
    SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 0 THEN score END ORDER BY date), ',', 1) AS game0_first,
    MAX(CASE WHEN game_id = 0 THEN score END) AS game0_max,
    SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 1 THEN score END ORDER BY date), ',', 1) AS game1_first,
    MAX(CASE WHEN game_id = 1 THEN score END) AS game1_max,
    SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 2 THEN score END ORDER BY date), ',', 1) AS game2_first,
    MAX(CASE WHEN game_id = 2 THEN score END) AS game2_max,
    SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 3 THEN score END ORDER BY date), ',', 1) AS game3_first,
    MAX(CASE WHEN game_id = 3 THEN score END) AS game3_max,
    SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 4 THEN score END ORDER BY date), ',', 1) AS game4_first,
    MAX(CASE WHEN game_id = 4 THEN score END) AS game4_max,
    SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 5 THEN score END ORDER BY date), ',', 1) AS game5_first,
    MAX(CASE WHEN game_id = 5 THEN score END) AS game5_max     
FROM cdu_user_progress 
FULL JOIN cdu_lessons ON cdu_lessons.id = cdu_user_progress.lesson_id 
WHERE cdu_user_progress.uid = 145 
GROUP BY lesson_id

FULL JOIN is not supported in mysql,at least not directly so FROM cdu_user_progress FULL JOIN... is interpreted as FROM cdu_user_progress as FULL . Esentially it replaces the table name with the alias FULL.

MySQL lacks support for FULL OUTER JOIN.

So if you want to emulate a Full join on MySQL take a look here .

A commonly suggested workaround looks like this:

   SELECT 
        cdu_lessons.*, 
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 0 THEN score END ORDER BY date), ',', 1) AS game0_first,
        MAX(CASE WHEN game_id = 0 THEN score END) AS game0_max,
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 1 THEN score END ORDER BY date), ',', 1) AS game1_first,
        MAX(CASE WHEN game_id = 1 THEN score END) AS game1_max,
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 2 THEN score END ORDER BY date), ',', 1) AS game2_first,
        MAX(CASE WHEN game_id = 2 THEN score END) AS game2_max,
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 3 THEN score END ORDER BY date), ',', 1) AS game3_first,
        MAX(CASE WHEN game_id = 3 THEN score END) AS game3_max,
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 4 THEN score END ORDER BY date), ',', 1) AS game4_first,
        MAX(CASE WHEN game_id = 4 THEN score END) AS game4_max,
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 5 THEN score END ORDER BY date), ',', 1) AS game5_first,
        MAX(CASE WHEN game_id = 5 THEN score END) AS game5_max     
    FROM cdu_user_progress 
    LEFT JOIN cdu_lessons ON cdu_lessons.id = cdu_user_progress.lesson_id 
    WHERE cdu_user_progress.uid = 145 
    GROUP BY lesson_id

Union ALL

    SELECT 
        cdu_lessons.*, 
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 0 THEN score END ORDER BY date), ',', 1) AS game0_first,
        MAX(CASE WHEN game_id = 0 THEN score END) AS game0_max,
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 1 THEN score END ORDER BY date), ',', 1) AS game1_first,
        MAX(CASE WHEN game_id = 1 THEN score END) AS game1_max,
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 2 THEN score END ORDER BY date), ',', 1) AS game2_first,
        MAX(CASE WHEN game_id = 2 THEN score END) AS game2_max,
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 3 THEN score END ORDER BY date), ',', 1) AS game3_first,
        MAX(CASE WHEN game_id = 3 THEN score END) AS game3_max,
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 4 THEN score END ORDER BY date), ',', 1) AS game4_first,
        MAX(CASE WHEN game_id = 4 THEN score END) AS game4_max,
        SUBSTRING_INDEX(GROUP_CONCAT(CASE WHEN game_id = 5 THEN score END ORDER BY date), ',', 1) AS game5_first,
        MAX(CASE WHEN game_id = 5 THEN score END) AS game5_max     
    FROM cdu_user_progress 
    RIGHT JOIN cdu_lessons ON cdu_lessons.id = cdu_user_progress.lesson_id 
    WHERE cdu_user_progress.uid = 145 
    GROUP BY lesson_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