Bikram Pahi Asked: 2015-02-12 03:23:28 +0800 CST2015-02-12 03:23:28 +0800 CST 2015-02-12 03:23:28 +0800 CST 从 MySQL 数据库中随机选择 10 个唯一行? 772 我有一张表 ( questions) 有 54 个问题。 学生必须回答所有 54 个问题。 我必须一次显示 10 个问题,然后再显示 10 个,依此类推...... 我必须随机选择 10 个问题和接下来的 10 个随机问题,除了前面 10 个已经回答的问题,依此类推.... 我将所有答案存储在另一个名为user_answer. MySQL 查询将是什么? mysql random 3 个回答 Voted Best Answer HackerPintu 2015-02-13T04:57:26+08:002015-02-13T04:57:26+08:00 您可以使用以下查询来执行此操作。 SELECT * FROM questions WHERE question_id NOT IN (SELECT question_id FROM student_answers WHERE student_id = '5') ORDER BY RAND() LIMIT 10; 我假设有 3 张桌子。 question - 保留所有问题 student_answers - 保存每个问题的学生特定答案。 学生 - 保存学生信息。 我希望 student_id 是 student 表的主键和 student_answer 表的外键。 student_is 是从会话或某处带来的。 thofle 2015-02-13T02:28:12+08:002015-02-13T02:28:12+08:00 在纯 SQL 中,我可能会做这样的事情,假设您保存每 10 个答案的答案。不过,不建议将它用于大桌子,NOT IN 有点慢。 SELECT ... FROM questions WHERE question_id NOT IN (SELECT question_id FROM user_answer WHERE user_id = <user_id>) ORDER BY RAND() LIMIT 10; 另一种方法是获取所有问题 ID 并在应用程序中跟踪它们。 Rick James 2015-02-12T15:04:14+08:002015-02-12T15:04:14+08:00 SELECT ... FROM tbl ... ORDER BY RAND() LIMIT 10; 给你一个随机的 10 个。但这不足以避免在接下来的 10 个中重复其中一些。所以让我们变得更复杂一些。让我们初始化随机数生成器(带有“种子”),以便序列是可重复的,然后使用 OFFSET 选择哪 10 个。 如果这是由网页处理的,那么种子必须从一个页面传递到下一个页面,类似于您用来决定“接下来 10 个”问题的时间的方式。 假设您不在乎序列是否重复一秒钟...... $seed = SELECT UNIX_TIMESTAMP(); SELECT ... FROM tbl ORDER BY RAND($seed) LIMIT 10 OFFSET $offset; 然后记住 $seed,但为下一个“页面”将 $offset 增加 10。 当然,在你用完问题后,你需要一些方法来停下来。
您可以使用以下查询来执行此操作。
SELECT * FROM questions WHERE question_id NOT IN (SELECT question_id FROM student_answers WHERE student_id = '5') ORDER BY RAND() LIMIT 10;
我假设有 3 张桌子。
我希望 student_id 是 student 表的主键和 student_answer 表的外键。
student_is 是从会话或某处带来的。
在纯 SQL 中,我可能会做这样的事情,假设您保存每 10 个答案的答案。不过,不建议将它用于大桌子,NOT IN 有点慢。
另一种方法是获取所有问题 ID 并在应用程序中跟踪它们。
给你一个随机的 10 个。但这不足以避免在接下来的 10 个中重复其中一些。所以让我们变得更复杂一些。让我们初始化随机数生成器(带有“种子”),以便序列是可重复的,然后使用 OFFSET 选择哪 10 个。
如果这是由网页处理的,那么种子必须从一个页面传递到下一个页面,类似于您用来决定“接下来 10 个”问题的时间的方式。
假设您不在乎序列是否重复一秒钟......
然后记住 $seed,但为下一个“页面”将 $offset 增加 10。
当然,在你用完问题后,你需要一些方法来停下来。