"购买本书的顾客还买过"的一个实现方法,但不一定是最好的:建议个表,三个字段: bookid1,bookid2,购买次数 某人买了A,B两本书,则在此表中写入: A,B,1 B,A,1 另一个人也买了这两本,则数据库中变为 A,B,2 B,A,2 第三个人买了A,B,C三本书,则数据库变为: A,B,3 B,A,3 A,C,1 B,C,1 C,A,1 C,B,1 查购买A书的顾客还买过: select bookid2 from table where bookid1='A' order by 购买次数 得出 B(3次) C(1次)
楼上的个人认为不怎么好,当一个人以前曾购了十本书时,当他在购买第十一本尽书后,在更新库时,不要一次性的插入十条件记录: newbookid,buyedbookid1,id newbookid,buyedbookid2,id newbookid,buyedbookid3,id newbookid,buyedbookid4,id newbookid,buyedbookid5,id newbookid,buyedbookid6,id newbookid,buyedbookid7,id newbookid,buyedbookid8,id newbookid,buyedbookid9,id newbookid,buyedbookid10,id 楼上的库在查询"购买本书的顾客还买过那些书时"比较方便,但入库时比较麻烦,我的想法是:建一个表 id 编号 bid 购买图书的id cid 顾客的id 当某人购买某本书时,只需把(id,bid,cid)入库, 查询"购买本书的顾客还买过那些书时"要分二步: 第一步查出购买此书的顾客放入一个临时表:select cid from table where bid="34" 第二步查出临时表中顾客还购买了那些书: select bid from table where cid in (select cid from table where bid="34");这两种方法在大数据量的条件时,百万级那一种效率更高一些,请有经验的高手指点
首先,楼主的sql语句要修改一下: select distinct cid from table where bid="34" 因为有个顾客可能先后买两本一样的书,所以去掉重复的第二步也要修改一下: select bid,count(*) as cnt from table where cid in (select distinct cid from table where bid="34") and bid<>'34' group by bid order by cnt desc; 这样写有三个目的: 1.去掉bid=34的书本身(bid<>'34') 2.bid会有重复的,所以要以bid分组,因为要得到购买次数,所以也要以bid分组(group by bid) 3.应该能够知道哪些书和bid=34的这本书的相关程度高,所以需要以购买次数进行排序,所以要用count(*)得到购买次数这个查询变得非常复杂,因为有in,导致索引失效,数据库要进行全表查询,对于大数据量的表格来说是不可能完成的任务我上面提到的方法有如下优势: 1.不需要进行实时的同步插入修改操作,可以在后台设置一个程序,每天根据当天的购买记录定时统计 2.完全通过主键查询,查询速度非常快(这点对于前台需要及时呈现的内容来说是非常重要的)希望还有更好的方法
某人买了A,B两本书,则在此表中写入:
A,B,1
B,A,1
另一个人也买了这两本,则数据库中变为
A,B,2
B,A,2
第三个人买了A,B,C三本书,则数据库变为:
A,B,3
B,A,3
A,C,1
B,C,1
C,A,1
C,B,1
查购买A书的顾客还买过: select bookid2 from table where bookid1='A' order by 购买次数
得出 B(3次) C(1次)
newbookid,buyedbookid1,id
newbookid,buyedbookid2,id
newbookid,buyedbookid3,id
newbookid,buyedbookid4,id
newbookid,buyedbookid5,id
newbookid,buyedbookid6,id
newbookid,buyedbookid7,id
newbookid,buyedbookid8,id
newbookid,buyedbookid9,id
newbookid,buyedbookid10,id
楼上的库在查询"购买本书的顾客还买过那些书时"比较方便,但入库时比较麻烦,我的想法是:建一个表
id 编号
bid 购买图书的id
cid 顾客的id
当某人购买某本书时,只需把(id,bid,cid)入库,
查询"购买本书的顾客还买过那些书时"要分二步:
第一步查出购买此书的顾客放入一个临时表:select cid from table where bid="34"
第二步查出临时表中顾客还购买了那些书:
select bid from table where cid in (select cid from table where bid="34");这两种方法在大数据量的条件时,百万级那一种效率更高一些,请有经验的高手指点
select distinct cid from table where bid="34"
因为有个顾客可能先后买两本一样的书,所以去掉重复的第二步也要修改一下:
select bid,count(*) as cnt from table where cid in (select distinct cid from table where bid="34") and bid<>'34' group by bid order by cnt desc; 这样写有三个目的:
1.去掉bid=34的书本身(bid<>'34')
2.bid会有重复的,所以要以bid分组,因为要得到购买次数,所以也要以bid分组(group by bid)
3.应该能够知道哪些书和bid=34的这本书的相关程度高,所以需要以购买次数进行排序,所以要用count(*)得到购买次数这个查询变得非常复杂,因为有in,导致索引失效,数据库要进行全表查询,对于大数据量的表格来说是不可能完成的任务我上面提到的方法有如下优势:
1.不需要进行实时的同步插入修改操作,可以在后台设置一个程序,每天根据当天的购买记录定时统计
2.完全通过主键查询,查询速度非常快(这点对于前台需要及时呈现的内容来说是非常重要的)希望还有更好的方法
30000*1*2*3*4*5*6*7*8*9*10 结果是不可想象,有没有更好的办法解决.
假设A买了3本书b1,b2,b3,表里的记录就是:
b1 b2
b2 b3
b3 b1
如果B买了2本书b2,b4,表里就会加一条记录
b2 b4
这样,只要写很简单的查询就可以知道书的关联情况了
假设A买了3本书b1,b2,b3,表里的记录就是:
b1 b2
b2 b3
b3 b1
如果B买了2本书b2,b4,表里就会加一条记录
b2 b4
这样,只要写很简单的查询就可以知道书的关联情况了
跟前几楼说的方法不一样,不要把买书的id记进去,这样记录数太大
只要记书的id就行,重复的记录数据库会去掉的
在book1列上做上索引,查询很快的
只是入库的时候要计算一下组合, 用程序做也不麻烦 :)