mysql - SELECT 查询将表的行作为 MySQL 中的列

标签 mysql database select

我有一个 MySQL 数据库,其中包含两个用于问题和答案的表。每道题都有一个正确答案和三个错误答案。每个问题总是有四个答案,只有一个是正确的。

表格是:

CREATE TABLE `question` (
  `id_question` smallint(5) unsigned NOT NULL auto_increment,
  `text` varchar(255) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`id_question`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE `answer` (
  `id_answer` mediumint(8) unsigned NOT NULL auto_increment,
  `id_question` smallint(5) unsigned NOT NULL,
  `is_correct` tinyint(1) NOT NULL,
  `text` varchar(45) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`id_answer`,`id_question`),
  KEY `fk_id_question_idx` (`id_question`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我需要有关选择查询的帮助。我想得到一个表格,其中行中有问题,列中有四个答案(首先是正确的,然后是其他三个)。到目前为止,我能够得到这样的输出:

Question | Answer | Is_Correct
-------------------------------
Question 1   Answer 1-1   1
Question 1   Answer 1-2   0
Question 1   Answer 1-3   0
Question 1   Answer 1-4   0
Question 2   Answer 2-1   1
Question 2   Answer 2-2   0
Question 2   Answer 2-3   0
Question 2   Answer 2-4   0
...

如何得到下面的结果?

Question | Correct_Answer | Incorrect_answer1 | Incorrect_answer2 | Incorrect_answer3
--------------------------------------------------------------
Question 1    Answer 1-1    Answer 1-2    Answer 1-3    Answer 1-4
Question 2    Answer 2-1    Answer 2-2    Answer 2-3    Answer 2-4

最佳答案

您可以通过使用带有 CASE 表达式的聚合函数来透视 数据。您可以使用用户定义的变量按问题在每一行上实现行号。您的代码将与此类似:

select q.text Question,
  max(case when a.is_correct = 1 then a.text end) Correct_answer,
  max(case when a.is_correct = 0 and rn=1 then a.text end) Incorrect_Answer1,
  max(case when a.is_correct = 0 and rn=2 then a.text end) Incorrect_Answer2,
  max(case when a.is_correct = 0 and rn=3 then a.text end) Incorrect_Answer3
from question q
inner join
(
  select a.id_question,
    a.text,
    a.is_correct,
    a.id_answer,
    @row:=case 
            when @prevQ=id_question
              and is_correct = 0
            then @row +1 
            else 0 end  rn,
    @prevA:=id_answer,
    @prevQ:=id_question
  from answer a
  cross join (select @row:=0, @prevA:=0, @prevQ:=0)r
  order by a.id_question, a.id_answer
) a
  on q.id_question = a.id_question
group by q.text
order by a.id_question, a.id_answer

参见 SQL Fiddle with Demo .这会在单独的列中给出结果:

|   QUESTION | CORRECT_ANSWER | INCORRECT_ANSWER1 | INCORRECT_ANSWER2 | INCORRECT_ANSWER3 |
-------------------------------------------------------------------------------------------
| Question 1 |     Answer 1-1 |        Answer 1-2 |        Answer 1-3 |        Answer 1-4 |
| Question 2 |     Answer 2-1 |        Answer 2-2 |        Answer 2-3 |        Answer 2-4 |

关于mysql - SELECT 查询将表的行作为 MySQL 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15280067/

相关文章:

MySQL:获取特定时区的本地时间

mysql - 优化复杂的 SQL 表达式

mysql - 如何根据特定的外部值对 MySQL 结果进行排序?

mysql - SQL-Oracle 查询

c# - SQL Server Search,如何返回总行数?

MySQL - 我如何取消一个字段而不是一个字符串?

mysql - Sql Query 中的错误 - 无法找到解决方案

database - docker-compose 与多个数据库

sql - 有没有办法在不卸载的情况下完全重置 SQL Server 实例?

javascript - 从值数组中设置 Angular 中选定的选项