MySQL数据透视表列数据作为行
我正在努力寻找解决这个MySQL问题的方法。 我似乎无法理解如何去做。 我有以下表格。
Question table +----+-------------+ | id | question | +----+-------------+ | 1 | Is it this? | | 2 | Or this? | | 3 | Or that? | +----+-------------+ Results Table +----+---------+--------+ | id | user_id | job_id | +----+---------+--------+ | 1 | 1 | 1 | | 2 | 1 | 3 | | 3 | 2 | 3 | +----+---------+--------+ Answers table +----+-------------------------+--------------+ | id | answer | fk_question_id | fk_result_id | +----+-------------------------+--------------+ | 1 | Yes | 1 | 1 | | 2 | No | 2 | 1 | | 3 | Maybe | 3 | 1 | | 4 | Maybe | 1 | 2 | | 5 | No | 2 | 2 | | 6 | Maybe | 3 | 2 | | 7 | Yes | 1 | 3 | | 8 | Yes | 2 | 3 | | 9 | No | 3 | 3 | +----+-------------------------+--------------+
如果可能的话,我想显示问题的答案作为每个结果集的列,像这样。
+-----------+---------+--------+-------------+----------+----------+ | result_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 | +-----------+---------+--------+-------------+----------+----------+
任何帮助将不胜感激。
谢谢
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演示
如果你有一些不知道的问题( 特别是像Matei Mihai说的1000 ),那么一个dynamic版本是非常必要的。
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演示
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 ║ ╚════╩═════════╩════════╩═════════════╩══════════╩══════════╝