MySQL Pivot Table Column Data as Rows
Solution 1:
SELECT a.ID,
a.user_ID,
a.job_id,
MAX(CASE WHEN c.question = 'Is it this?' THEN b.answer END) 'Is it this?',
MAX(CASE WHEN c.question = 'Or this?' THEN b.answer END) 'Or this?',
MAX(CASE WHEN c.question = 'Or that? ' THEN b.answer END) 'Or that? '
FROM Results a
INNER JOIN Answers b
ON a.id = b.fk_result_id
INNER JOIN Question c
ON b.fk_question_id = c.ID
GROUP BY a.ID,
a.user_ID,
a.job_id
- SQLFiddle Demo
If you have unknow number of questions (specifically 1000 like Matei Mihai said), a dynamic version is much required.
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN c.question = ''',
question,
''' then b.answer end) AS ',
CONCAT('`',question,'`')
)
) INTO @sql
FROM Question;
SET @sql = CONCAT('SELECT a.ID,
a.user_ID,
a.job_id, ', @sql, '
FROM Results a
INNER JOIN Answers b
ON a.id = b.fk_result_id
INNER JOIN Question c
ON b.fk_question_id = c.ID
GROUP BY a.ID,
a.user_ID,
a.job_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
- SQLFiddle Demo
OUTPUT
╔════╦═════════╦════════╦═════════════╦══════════╦══════════╗
║ ID ║ USER_ID ║ JOB_ID ║ IS IT THIS? ║ OR THIS? ║ OR THAT? ║
╠════╬═════════╬════════╬═════════════╬══════════╬══════════╣
║ 1 ║ 1 ║ 1 ║ Yes ║ No ║ Maybe ║
║ 2 ║ 1 ║ 3 ║ Maybe ║ No ║ Maybe ║
║ 3 ║ 2 ║ 3 ║ Yes ║ Yes ║ No ║
╚════╩═════════╩════════╩═════════════╩══════════╩══════════╝