MYSQL随机选择唯一行-排除以前选择的行


MYSQL RANDOM SELECT UNIQUE ROWS - Excluding previously selected rows

我有一个16K条目的表
我想随机提取44个条目
但我不想重复相同的条目一次(永远)
因此,我有一个按用户列表,它将已经使用的"ID"作为逗号分隔的字符串保存在表中
我用这个列表来选择。。。NOT IN(used_ID)

问题是这个列表太大了,sql调用失败了,因为我认为太大了

有什么想法可以更有效地做到这一点吗?

Questions table:
+------+-------+-------+
| id   | Qtext | Tags  |
+------+-------+-------+
Test table:
+------+-------+
| id   | QIDs  |
+------+-------+
Results table:
+------+-------+-------+
| id   | tID   | uID   |
+------+-------+-------+

我需要根据结果表从问题表中选择唯一的随机值。(将测试ID与问题ID关联起来)

当前正在尝试使用:

SELECT DISTINCT `questions`.`ID`
FROM `questions`, `tests`, `results`
WHERE 
`questions`.`ID` NOT IN (`tests`.`qIDs`)
AND `results`.`uID` = 1 AND `tests`.`ID` = `results`.`tID`
AND 4 IN ( `questions`.`tags`) 
AND "http://www.usmlestep2qna.com" = `provider`
ORDER BY RAND() LIMIT 27;

有什么想法吗?

您可以创建一个高表来存储这些值,而不是将使用过的用户Id值放在一列中以逗号分隔的字符串中。这应该会产生更好的性能

与其使用具有(潜在巨大)CSV的单行,为什么不使用索引良好的表和外部联接来挑选不匹配的记录呢。我的测试数据库中有一个例子:

mysql> select * from first;
+------+-------+
| id   | title |
+------+-------+
|    1 | aaaa  |
|    2 | bbbb  |
|    3 | cccc  |
|    4 | NULL  |
|    6 | gggg  |
+------+-------+
5 rows in set (0.00 sec)
mysql> select * from second;
+------+----------+------+------+-------+------+
| id   | first_id | one  | two  | three | four |
+------+----------+------+------+-------+------+
|    1 |        1 |    3 |    0 |     4 |    6 |
|    1 |        2 |    4 |    4 |     1 |    2 |
|    3 |        3 |    1 | NULL |     3 |    4 |
+------+----------+------+------+-------+------+
3 rows in set (0.00 sec)
mysql> select a.id from first a join second b on a.id=b.first_id;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)
mysql> select a.id from first a 
left outer join second b on a.id=b.first_id where b.first_id is null;
+------+
| id   |
+------+
|    4 |
|    6 |
+------+
2 rows in set (0.00 sec)

这会很好地提高你的表现。