gpt4 book ai didi

mysql - 数据库设计/SQL 优化 : WHERE NOT IN (thousands of IDs)

转载 作者:行者123 更新时间:2023-11-29 04:52:25 25 4
gpt4 key购买 nike

有人要求我向应用程序添加功能,让用户在两个选项之间进行投票:A 和 B。这些问题的表格非常基本:

QUESTIONS
question_id (PK)
option_id_1(FK)
option_id_2(FK)
urgent (boolean)

每次用户投票时,用户投票的结果都存储在一个同样简单的表中:

USER VOTES
vote_id (PK)
user_id (FK)
question_id (FK)

当用户请求一个新问题时,选择出现哪个问题的算法很复杂,但出于我们的目的,我们可以假设它是随机的。那么,问题是什么?

每个用户都会对许多问题进行投票。可能有数百个,也可能有数千个。我需要确保没有用户看到他们已经投票的问题,而我认为这样做的唯一方法是,我猜,将服务器抛到脑后。具体来说,像这样:

SELECT * from questions WHERE question_id NOT in (SELECT question_id from user_votes WHERE user_id = <user_id>) ORDER BY RAND() LIMIT 1. 

[注意:RAND() 实际上并不在查询中 - 它只是作为稍微复杂的 (order_by) 的替代品。]

因此,请记住,如果不是数千个问题,许多用户很可能已经对数百个问题进行了投票,并且不可能以固定顺序呈现问题......关于如何排除投票问题的任何想法把我的服务器打到地上?

感谢所有建议 - 非常感谢。

最佳答案

JOIN 运算符比 MySQL 中的嵌套查询执行得更好(这可能随着最新的 MySQL 版本而改变,但如果您遇到性能问题,我想我的声明仍然有效)

您可以做的只是将投票留在问题上,只选择那些没有投票的记录(没有人投票):

SELECT * 
FROM questions q
LEFT JOIN user_votes uv ON
uv.question_id = q.question_id AND
uv.user_id = '<user_id>'
WHERE vote_id IS NULL

关于mysql - 数据库设计/SQL 优化 : WHERE <id> NOT IN (thousands of IDs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10228372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com