Reputation: 69
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
Upvotes: 0
Views: 51
Reputation: 28403
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
Upvotes: 0
Reputation: 26784
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.
Upvotes: 1