如果ID不在Array /逗号分隔列表中,则获取行

时间:2013-01-16 09:52:42

标签: mysql sql

我不知道这是否是一个SQL功能......简而言之:我想要一个表中的行,这个行在另一个表中的数组/逗号分隔列表中找不到。更多信息如下:

设置是两个表;用户表和问题表。 user-table有一个名为answersQuestions的列,一个以逗号分隔的列表,其中包含用户已回答的问题ID。

我正在尝试获得4个随机问题,其中每个问题尚未得到答案。

我如何随机获得4个SQL查询

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);

3 个答案:

答案 0 :(得分:1)

不太喜欢你的解决方案。使用底层数据库设计,您正在为自己做更多事情。

您有两个表,一个表示用户,另一个表示问题。你真正需要的是一个链接这两个概念的表,比如用户问题。

建议设计: -

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,所以请随时纠正任何错别字,SO&#crs。但这种方法很合理。

答案 1 :(得分:0)

虽然Paul是正确的,但你真的应该重构你的数据库。以下内容应与现有结构一起使用:

DECLARE @askedIDs VARCHAR(2000)

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

执行('SELECT * FROM问题WHERE ID NOT IN('+ @askedIDs +')')

答案 2 :(得分: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 Fiddle DEMO

虽然你已经开始运行,但你应该看一下规范化和重新设计你的表结构。