先说下数据库表结构拍卖表A 字段:
id 编号
name 商品名称
buyer 买家
date 结束时间
竞价表B 字段:
id 编号
buyer 竞价者
price 竞价金额
date 时间
我的做法是,先在“拍卖表A”中添加一条拍卖记录竞价者每一次出价,都会在“竞价表B”中添加一条记录问题是拍卖到时间结束后,“拍卖表A”中的buyer字段用什么方式自动写入买家ID进去?因为最后一个用户的出价记录都是在“竞价表B”中插入记录,程序事先无法判断哪个出价记录会是最后的成功得标者,只有到设置的拍卖结束时间才知道最终答案,这时候还是要去查询“竞价表B”,看谁是最后一个提交最高价格的。
id 编号
name 商品名称
buyer 买家
date 结束时间
竞价表B 字段:
id 编号
buyer 竞价者
price 竞价金额
date 时间
我的做法是,先在“拍卖表A”中添加一条拍卖记录竞价者每一次出价,都会在“竞价表B”中添加一条记录问题是拍卖到时间结束后,“拍卖表A”中的buyer字段用什么方式自动写入买家ID进去?因为最后一个用户的出价记录都是在“竞价表B”中插入记录,程序事先无法判断哪个出价记录会是最后的成功得标者,只有到设置的拍卖结束时间才知道最终答案,这时候还是要去查询“竞价表B”,看谁是最后一个提交最高价格的。
就是buyer字段吗?
我想8楼的意思就是不必每次有人出价都修改A表中的最终买家字段,因为此时还没最终卖出,而只需要在最终卖出去了之后再在B表里读取最终买家的ID,把这个ID修改到A表中去。
比如10秒内,有人出价,则更新Cron为10秒过后执行,需要执行的是一条SQL语句。
select buyer from table_B where product_id = xxx order by price desc limit 1
类似于这样的语句,并且同时要禁止其他人出价,可以是锁定记录或者修改表A字段的值为结束状态,并加入结束时间和最终出价人。如果又有人出价,则再次更新Cron为当前时间的10秒后。Cron可以有多条同时并存,也就是多个商品同时竞拍。
触发器大致如下
mysql>delimiter ||
mysql> create trigger update_max
-> after insert on B for each row
-> begin
-> update A set max_price=NEW.price,buyer=NEW.buyer where id=NEW.product_id and max_price<=NEW.price and date>NEW.date;
-> end||
mysql>delimiter ;
哦,触发器,其实也是要执行两条sql
如果用户出价时,直接也执行两条sql,效率应该差不多吧?
那就没有必要搞触发器了
虽然每次插入的时候多了一条sql,但是在拍卖结束前,每次查询当前最高出价时,不需要再连接B表查,所以也很难说谁的效率更好,因为这个查询使用率很高,
(每次用户来到该页面都会运行该sql,而出价的人相对少很多)当然这个要看你的具体页面,如果同一页面上有详细出价记录,也可以省掉该查询...还是那句,看你的具体情况....