我目前有一个无限滚动,当用户到达页面底部时会打印数据库行块。
我想要做的是对整个数据库进行随机播放,以便用户每次加载页面时都以不同的顺序获取它们(但没有条目出现两次)。
此表只会增长,所以我希望尽可能高效地完成。
我的查询目前是:
mysqli_query($con, "SELECT * FROM shopaholic ORDER BY RAND() LIMIT 36");
这有两个明显的缺点:
RAND()
所以它会非常慢我如何以更好的方式解决这个问题?
如果您需要查看其他相关代码,请告诉我。
答案 0 :(得分:0)
如果您不想跟踪用户已经看过哪些记录,那么如果他们刷新页面,他们仍然可能会看到相同的记录。
您可能会考虑放弃他们没有看到任何重复的要求,因为这是最苛刻的要求。也许只是添加一些逻辑,以便他们不会在同一页面上看到重复,所以至少它不会那么明显。
按RAND()
排序将扫描表格中的所有行。假设您有一些auto_increment主键,您可以选择最低和最高主键之间的随机数。您可能认为1
最低,MAX()
获得最高。
然后执行这样的查询,其中随机值为58494
:
SELECT * FROM shopaholic WHERE ID >= 58494 LIMIT 1
如果主键中没有任何空白,则可以使用=
代替>=
。
此查询将很快,因为它只读取一条记录。因此,在循环中执行此操作(例如,对于36个记录的列表,为36次)。如果您要跟踪他们看过的记录,请根据该数据集检查每条记录,看看他们是否已经看过该记录。您还可以检查是否已经为页面加载了这个,这样您至少不会在同一页面上获得重复项。
如果您正在尝试查找用户尚未看到的记录,那么当用户通过搜索结果进行搜索时,找到他们尚未看到的“随机”记录将变得越来越昂贵,尤其是数据集增长。另一个不担心重复的原因。