我正在制作Facemash-Alike Script。它的脚本显示两张图片,用户可以选择哪张图片更适合他。
我想创建一个小改进,不会向用户显示他已投票的两张图片的相同组合。
我试图以两种方式做到这一点。但任何这种方式对用户来说都不够好或不舒服。
第一个 - 两张图片的选择是随机的。投票后,在数据库中,使用此特定组合和投票值创建新记录。如果两张图片的组合已作为记录存在于数据库中,则页面显示历史投票,并在几秒钟后刷新页面,进行另一种随机组合。
第二个 - 在图片名称添加到数据库的那一刻,脚本会创建所有可能的组合作为数据库中的记录。这是好方法,因为脚本从数据库中提取一个不包含任何结果的随机记录,并在投票后保存一个值。所以没有办法重复。这种方式的主要问题是在添加新图片的那一刻。数据库在开始变得巨大,并在开始时永远创造所有可能的组合。
因此,我正在寻找另一种解决方案。我希望听到一些可能有助于找到我的小建议。
答案 0 :(得分:0)
您的第一种方法可以更好地扩展,您只是想避免显示历史投票。无论如何,您需要保留投票历史记录,因此请将该历史记录用作过滤器。在SELECT语句中,用于获取历史表上的随机面,左连接以使用连接作为过滤器。
示例:
SELECT faces.uid f_uid, votes.uid v_uid FROM faces
LEFT JOIN votes ON votes.user_id=# AND faces.uid=votes.face_id1 AND
faces.uid=votes.face_id2
WHERE v_uid IS NULL
ORDER BY RAND() LIMIT 2
这将确保他们永远不会两次看到同一张脸。用户投票的面孔越多,速度就越慢。在他们完成数百票之前,它不会明显变慢。
也就是说,您可以将LIMIT更改为20并缓存(即在会话中)。然后你准备好接下来的10对(20/2 = 10)。这是1&的组合。 2。