首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择查询获取表的行作为MySQL中的列

选择查询获取表的行作为MySQL中的列
EN

Stack Overflow用户
提问于 2013-03-08 03:30:51
回答 2查看 684关注 0票数 1

我有一个包含两个问题和答案的MySQL数据库。每个问题都有一个正确答案和三个错误答案。每个问题总是有四个答案,而且只有一个是正确的。

这些表包括:

代码语言:javascript
复制
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;

我需要关于select查询的帮助。我想要一个表,每行都有问题,四个答案作为列(首先是正确的,然后是其他三个)。到目前为止,我可以得到如下输出:

代码语言:javascript
复制
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
...

如何才能得到以下结果?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-08 03:54:24

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

代码语言:javascript
复制
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。这会在单独的列中给出结果:

代码语言:javascript
复制
|   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 |
票数 2
EN

Stack Overflow用户

发布于 2013-03-08 03:34:58

为此构建动态透视查询是一项大量的工作。相反,我可能会使用MySQL的GROUP_CONCAT()聚合函数来创建一个逗号分隔的Incorrect_answer字段列表,同时将Correct_Answer分离为自己的列:

代码语言:javascript
复制
SELECT
  question.`text`,
  /* Separate the one where Is_Correct = 1 and discard the others with a MAX() aggregate */
  MAX(CASE WHEN Is_Correct = 1 THEN answer.`text` ELSE NULL END) AS Correct_Answer,
  /* Group the rows where Is_Correct = 0 into a comma-separated list */
  GROUP_CONCAT(CASE WHEN Is_Correct = 0 THEN answer.`text` ELSE NULL END) AS Incorrect_answers
FROM
  question
  JOIN answer ON question.id_question = answer.id_question
GROUP BY Question.`text`

当您的应用程序代码接收到此结果时,结果如下:

代码语言:javascript
复制
Question     Correct_Answer Incorrect_answers
--------------------------------------------------------------
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

然后,在应用程序代码中拆分,上的Incorrect_answers列就变得很简单了,因为它是一个逗号分隔的列表。

例如,在PHP中,类似于:

代码语言:javascript
复制
$incorrect = explode(',', $row['Incorrect_answers']);

或者在Ruby或Python中:

代码语言:javascript
复制
incorrect = incorrect_answers.split(',')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15280067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档