我的网站类似豆瓣(就是注册用户可以对一本书根据自己读没读过对它进行标记,可以选择想读,在读与读过)。现在我想实现一个功能,对于一个注册用户,能帮他找出所有与他读的书互补的人(即A想读1书和3书,读过2书;B想读2书和4书,读过1书和5书。则A和B便是因为1、2书互补的人)以方便他们交换书籍。用来存储用户对书的标记的数据库是这样设计的:
id
user_id //用户的id
book_id //书籍的id
relation //用户和书籍的关系(1:想读,2:在读,3:读过)考虑到每个用户会有很多想读的与读过的书,请问大家怎么才能快速地实现这一功能呢?谢谢大家~

解决方案 »

  1.   

    请问大家怎么才能快速地实现这一功能呢?是SQL语句?
      

  2.   

    table: tbl_user_book
    user_id book_id relation
    A 1 1
    A 3 1
    A 2 3
    B 2 1
    B 4 1
    B 1 3
    B 5 3先找到登录用户(假设是A)想读和读过的书籍的list
    select a.user_id as 和你互补的读者, a.book_id as 他/她读过的书, b.book_id as 他/她想读的书
    from tbl_user_book a, tbl_user_book b
    where a.user_id = b.user_id
      and a.book_id in (...)                 //括号中的list就是A想读的书籍
      and a.relation = 3
      and b.book_id in (...)                 //括号中的list就是A读过的书籍
      and b.relation = 1
      

  3.   

    不一定是SQL语句,我觉得这个功能直接使用现有的表可能效率不高。或许应该为这个功能再设计一个表
      

  4.   

    一个用户读过的书,应该不会超过1000本吧,基于这个假设。
    设置索引 (user_id,relation)但这个SQL语句显示并不理想。建议你可以给出一个表结构和想要的结果。这样别人可以直接看看有没有更好的SQL语句。
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  5.   

    索引的话,你经常找的应该是想读/读过XXX书的人,我觉得可以用(book_id,relation)