我不知道这是否是一个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);
答案 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
虽然你已经开始运行,但你应该看一下规范化和重新设计你的表结构。