我正在努力寻找解决此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
如果您不清楚问题的数量( 例如Matei Mihai所说的1000个 ),则非常需要动态版本。
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;
输出值
╔════╦═════════╦════════╦═════════════╦══════════╦══════════╗ ║ 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 ║ ╚════╩═════════╩════════╩═════════════╩══════════╩══════════╝