Php 限制具有特定属性的mysql记录数

Php 限制具有特定属性的mysql记录数,php,mysql,Php,Mysql,请提供一种有效的方法来限制用户标记为收藏夹的图书数量 用户用书表 这需要多达3 DB的查询,因此效率似乎很低。有人能推荐一个更好的选择吗?您可以在一个查询中取消设置收藏夹: update user_book ub join (select ub2.* from user_book ub2 where ub2.userId = 25 and (attr & 4) > 0 order by ub2.addedTime des

请提供一种有效的方法来限制用户标记为收藏夹的图书数量

用户用书表


这需要多达3 DB的查询,因此效率似乎很低。有人能推荐一个更好的选择吗?

您可以在一个查询中取消设置收藏夹:

update user_book ub join
       (select ub2.*
        from user_book ub2
        where ub2.userId = 25 and (attr & 4) > 0
        order by ub2.addedTime desc
        offset 24 limit 999
       ) keep24
       on ub.bookid = keep24.bookid and ub.userid = keep24.userid
    set attr = attr ^ 4;
有了一个关于user_bookuserId、addTime和user_bookuserId、bookId的索引,这应该会非常快

然后可以使用insert语句插入新收藏夹


注意:我认为自动删除收藏夹不是一个好主意,但这似乎是您的应用程序设计。

让系统自动取消收藏一本书,而不是拒绝收藏另一本书,这似乎是一个有趣的用户体验细节。我想你已经准备好了什么东西来通知用户这将要发生?@cale_b在前端,如果用户喜欢的书超过19本,我会在每次她喜欢的时候通知用户一个警告,还有一个问题:当收藏夹列表的大小大于24时,为什么要重置所有收藏夹?相反,它不应该只重置一个收藏夹,以便给新的收藏夹留出空间吗?@1000111我将只重置收藏夹25+。因此,如果有25个,它将只是一个最受欢迎的结果:数组_切片正好在if行之后。更新用户\u book ub内部联接选择ub2.*从用户\u book ub2中,ub2.userId=25 ORDER BYADTEDTIME DESC LIMIT 1 OFFSET 24作为ub.BOCKID=keep24.BOCKID和ub.userId=keep24.userId SET ub.attr=ub.attr^4上的keep24;现在呢?嗨,戈登。非常感谢。我在SQL方面还不够强,无法完全理解您的答案,所以我有几个Q。在第4行,b2.userId指的是哪个表?在最后一行的下一行,为什么要设置ub.userid=keep24.bookid?关于内部查询:为什么要选择userId=25的所有书籍,而不是将选择限制在受欢迎的书籍上?还有,对我来说,无限制地使用偏移量会带来错误。看,哇。杰出-不知道你可以用mysql做这些事情。哎呀。意图是抵消,但当然,也需要限制。我做到了999。根据你的规则,1个就足够了。
//sql to get all books the user has marked as favorite; oldest book first
SELECT bookID from user_book WHERE userID=25 AND (Attr & 4)>0 
    ORDER BY addedTime ASC 

if(($count = count($results)) > 24){ //if more than 24 books are favorited
    $bookIDsToUnset = array_slice($results,0,$count-24); //get books over limit
    $bookIDsToUnset = implode(',' , $bookIDsToUnset);

    //unset the favorite attribute from the books over the limit
    UPDATE user_book SET Attr = Attr^4 WHERE userID=25 
        AND bookID IN ($bookIDsToUnset)
}

//make bookID 100 a favorite
UPDATE user_book SET Attr = Attr | 4 WHERE userID=25 AND bookID=100
update user_book ub join
       (select ub2.*
        from user_book ub2
        where ub2.userId = 25 and (attr & 4) > 0
        order by ub2.addedTime desc
        offset 24 limit 999
       ) keep24
       on ub.bookid = keep24.bookid and ub.userid = keep24.userid
    set attr = attr ^ 4;