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 - テキスト

User_answers: 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 に答える
-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 に答える