0

これが SQL 機能であるかどうかはわかりません... 要するに、別のテーブルの配列/カンマ区切りリストで ID が見つからないテーブルの行が必要です。以下の詳細情報:

セットアップは 2 つのテーブルです。ユーザーテーブルと質問テーブル。user-table には、ユーザーが回答した質問 ID を含む、カンマ区切りのリストである AnswerQuestions という列があります。

私は 4 つのランダムな質問を取得しようとしていますが、それぞれにはまだ回答がありません。

SQLクエリでランダムに4を取得する方法

SELECT * FROM questions WHERE id >= RAND() * (SELECT MAX(id) FROM questions) LIMIT 4

ただし、これは、ユーザーが以前にその質問をしたことがあるかどうかを考慮せずに、4 つのランダムな質問を返すだけです。

Javascriptでやるとしたらこんな感じ

var questions = [1,2,3,4,5,6,7,8,9,10,11,12];
var answeredQuestions = [3,5,9,12];
var sqlReturn = [];

for (var i=0;i<4;i++) { 
  var randNo = 0;

  while (randNo == 0 || sqlReturn.indexOf(randNo) > -1 || answeredQuestions.indexOf(randNo) > -1) {
    randNo = Math.floor((Math.random()*questions.length)+1);
  }

  sqlReturn[i] = randNo;
}

document.write(sqlReturn);
4

3 に答える 3

1

あなたのソリューションがあまり好きではありません。基礎となるデータベースの設計により、自分自身で物事をより困難にしています。

2 つのテーブルがあり、1 つはユーザーを表し、もう 1 つは質問を表します。本当に必要なのは、ユーザーの質問のような、2 つの概念をリンクする表です。

提案されたデザイン:-

create table `user-questions`
(
   user_id int,
   question_id int,
   answered datetime
)

回答を記録するための推奨される方法。

ユーザーが質問に回答するたびに、ユーザーの質問に行を追加して、ユーザーが質問に回答したという事実を示します。

この構造の下では、特定の問題を解決し、まだ答えられていない質問を見つけることは簡単になります。

-- Find a question that hasn't been answered by user id 22.
SELECT
  q.* 
FROM 
  `questions`
LEFT OUTER JOIN `user-questions` uq
ON q.question_id = uq.question_id
-- Just a sample user ID
AND uq.user_id = 22
WHERE
  uq.question_id IS NULL

私は日常的に MySQL を扱っているわけではないので、タイプミスがあれば遠慮なく修正してください。ただし、アプローチは健全です。

于 2013-01-16T10:05:06.713 に答える
0

関数FIND_IN_SETはそうするのに役立ちます

特定のユーザーの未回答の質問をすべて取得するには:

SELECT *
  FROM questions
 WHERE NOT FIND_IN_SET( id, ( SELECT answered_questions 
                                FROM users 
                               WHERE id = 1 ) )

4 つのランダムな未回答の質問のみを取得するには:

  SELECT *
    FROM questions
   WHERE NOT FIND_IN_SET( id, ( SELECT answered_questions 
                                  FROM users 
                                 WHERE id = 1 ) )
ORDER BY RAND()
   LIMIT 4

SQL フィドルのデモ

これを実行しても、正規化とテーブル構造の再設計を検討する必要があります。

于 2013-01-16T10:07:04.790 に答える
0

While Paul is correct, you really should refactor your DB. The following should do it with your existing structure:

DECLARE @askedIDs VARCHAR(2000)

SET @askedIDs = (SELECT answeredQuestions FROM User WHERE UserID = @userID)

EXECUTE ('SELECT * FROM Questions WHERE ID NOT IN ( ' + @askedIDs +')')

于 2013-01-16T10:06:49.970 に答える