1

我想找到列值为 1 和 userid=3 的列名,例如我有一个表

问题

 quesitonid   userid      answer1 answer2 answer3 
  1            1          0         1        0   
  2            2          1         0        0
  3            3          0         0       1

结果将产生为

  question1   userid   answer3
     3           3         1

我怎么能用 sql 做到这一点?我尝试了很多但没有成功,如果有人可以提供帮助,在此先感谢他的百万......

这是我的 sql 查询

SELECT * from questions Q WHERE  Q.userid=1 AND (Q.answer1=1 OR Q.answer2=1 OR Q.answer3=1)
4

5 回答 5

2

试试这个

SELECT *
,CASE
    WHEN ( answer1 =1)   THEN 'answer1'
    WHEN ( answer2 =1)  THEN 'answer2'
    WHEN ( answer3 =1)   THEN ' answer3'
    ELSE 'nobody'
END
AS selected_answer
FROM Q
WHERE  Q.userid=1 AND (Q.answer1=1 OR Q.answer2=1 OR Q.answer3=1)
于 2013-10-02T13:41:07.020 回答
0

您首先必须将您的表格分成 4 个,如下所示:

用户:id - 姓名

问题:id - 文本

答案:id - fk_question - 文本

用户答案:id - fk_user - fk_question - fk_answer

我的出口给你:

CREATE TABLE IF NOT EXISTS `answer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fk_question` int(11) NOT NULL,
  `text` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

INSERT INTO `answer` (`id`, `fk_question`, `text`) VALUES
(1, 1, 'it is 3'),
(2, 1, 'it is 2'),
(3, 1, 'it is 5');

CREATE TABLE IF NOT EXISTS `question` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `text` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

INSERT INTO `question` (`id`, `text`) VALUES
(1, 'what is 1 + 1');

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

INSERT INTO `users` (`id`, `name`) VALUES
(1, 'pipo'),
(2, 'kees'),
(3, 'jan'),
(4, 'hessel'),
(5, 'geke'),
(6, 'daan'),
(7, 'ray'),
(8, 'jelle'),
(9, 'klaas'),
(10, 'berent');

CREATE TABLE IF NOT EXISTS `users_answers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fk_user` int(11) NOT NULL,
  `fk_question` int(11) NOT NULL,
  `fk_answer` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

INSERT INTO `users_answers` (`id`, `fk_user`, `fk_question`, `fk_answer`) VALUES
(1, 2, 1, 2),
(2, 4, 1, 3);

然后很容易你不需要查看哪个列名设置为 1 你只需获取数据。这样可以有超过3个答案。事实上,现在它的变量:

SELECT q.`id` , u.`id` , a.`id`
FROM  `users_answers` ua
INNER JOIN  `users` u ON ua.`fk_user` = u.`id`
INNER JOIN  `question` q ON ua.`fk_question` = q.`id`
INNER JOIN  `answer` a ON ua.`fk_answer` = a.`id`
WHERE u.`id` =2

将返回

question    user    answer

1             2        2

但我会直接使用这个:

SELECT q.`text` AS  `question` , u.`name` AS  `user` , a.`text` AS  `answer` 
FROM  `users_answers` ua
INNER JOIN  `users` u ON ua.`fk_user` = u.`id` 
INNER JOIN  `question` q ON ua.`fk_question` = q.`id` 
INNER JOIN  `answer` a ON ua.`fk_answer` = a.`id` 
WHERE u.`id` =2
AND q.`id` =1

它返回:

question        user    answer
what is 1 + 1   kees    it is 2
于 2013-10-02T13:34:17.183 回答
0

如果您只想根据某些列是否包含一个值来恢复它们,这在 SQL 中是不可能的。实现此目的的唯一方法是使用 PIVOT,否则,您将不得不恢复在 select 语句中建立的所有列。

于 2013-10-02T13:51:39.420 回答
-1

我认为做你想做的最简单的方法是使用上面发布的查询获取数据并迭代结果并在客户端获取想要的列(在你的情况下是 php)。

于 2013-10-02T12:55:45.773 回答
-1

SELECT * FROM question WHERE userid = 1 AND (answer1 =1 || answer2 =1 || answer3=1)

这将向您显示带有相应匹配项的完整表格。此外,您可以单独获取您想要的记录,并在您的程序中进行进一步的操作。

于 2013-10-02T13:06:36.220 回答