想象一下:
成员表有10,000多个记录
拥有10,000多个记录的图书表
什么是最佳选择方法
RANDOM成员并分配RANDOM书给他
谁以前没有分配给他?
我设计用于存储会员/书籍分配的发行表和查询
并且返回新记录非常慢。
发行表自然会变得很胖。
最佳答案
RANDOM()
非常慢。尝试在表中添加“ random_order”列,并使用RANDOM()
函数为每行分配一个随机数。确保为这些列建立索引,然后再使用查询选择最大的random_order项目。由于随机列是随机列,因此最大数目没有意义,除非“从推荐列表的顶部拿走一本书”。此方法将为每个成员按相同顺序推荐书籍,但这将是随机顺序。您可以每天更新random_order
列以将其改组。
如何防止连续两次获得同一本书?您需要跟踪向哪些成员推荐了哪些书籍,并将它们从MAX()计算中排除。
表格:member_books_recommended
列:member_id,book_id(在删除/更新级联时,具有指向父表的外键的InnoDB表)
每当您提出建议时,就运行此SQL记录您已向该成员推荐了这本书:
INSERT INTO member_books_recommended (`member_id`, `book_id`) VALUES ($member_id,$book_id); // assuming PHP code for the member id, book id
当您获得下一个推荐时,可以使用以前推荐的书的表格从推荐书的列表中排除结果:
SELECT `book_id` FROM `books_table` WHERE `book_id` NOT IN (SELECT `book_id` FROM `member_books_recommended` WHERE `member_id` = $member_id) ORDER BY `random_column` DESC LIMIT 1; // again PHP code for $member_id
希望对您有所帮助。
关于mysql - 高效查询以选择以前未发行的书籍,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27052056/