先说下数据库表结构拍卖表A 字段:
id 编号
name 商品名称
buyer 买家
date 结束时间
竞价表B 字段:
id 编号
buyer 竞价者
price 竞价金额
date 时间
我的做法是,先在“拍卖表A”中添加一条拍卖记录竞价者每一次出价,都会在“竞价表B”中添加一条记录问题是拍卖到时间结束后,“拍卖表A”中的buyer字段用什么方式自动写入买家ID进去?因为最后一个用户的出价记录都是在“竞价表B”中插入记录,程序事先无法判断哪个出价记录会是最后的成功得标者,只有到设置的拍卖结束时间才知道最终答案,这时候还是要去查询“竞价表B”,看谁是最后一个提交最高价格的。

解决方案 »

  1.   

    竞价表B怎么没有拍卖表A的ID,表设计不合理,楼主你想,竞价应该是对应一种拍卖品,所以竞价表B应该有拍卖表A的ID
      

  2.   

    我想到一个笨的方法用户出价时,除了在“竞价表”中添加一条记录外,还会更新“拍卖表”中这条商品记录的字段buyer为该用户这样,“拍卖表”中的买家字段buyer里的值,永远是最后一个出价的用户账号但是这样会增加系统损耗,多一条sql更新记录,如果网站拍卖的量非常大,对服务器资源来说,这也是一个不小的开支哦。
      

  3.   

    每条记录中有个字段是存储最终得标者的
    就是buyer字段吗?
      

  4.   

    你只需统计竞价表B中每种商品的最高价插入A表中即可。而不必每次出价都往A表中插入一条记录。
      

  5.   


    我想8楼的意思就是不必每次有人出价都修改A表中的最终买家字段,因为此时还没最终卖出,而只需要在最终卖出去了之后再在B表里读取最终买家的ID,把这个ID修改到A表中去。
      

  6.   

    写个条件触发呗,条件是:当时间结束了,就执行查询最终出价人,并把他的ID记录到表A的buyer字段中
      

  7.   

    查询得标人为什么要查2个表呀?没看明白根据你的表设计,有如下sql:select buyer from table_B where product_id = xxx order by price desc limit 1 
      

  8.   

    本帖最后由 xuzuning 于 2012-02-14 11:09:23 编辑
      

  9.   

    你说的这办法不行的,他应该必须得记录买家花了多少钱竞拍,这个用户也需要知道的。可以配合使用Cron功能。
    比如10秒内,有人出价,则更新Cron为10秒过后执行,需要执行的是一条SQL语句。
    select buyer from table_B where product_id = xxx order by price desc limit 1 
    类似于这样的语句,并且同时要禁止其他人出价,可以是锁定记录或者修改表A字段的值为结束状态,并加入结束时间和最终出价人。如果又有人出价,则再次更新Cron为当前时间的10秒后。Cron可以有多条同时并存,也就是多个商品同时竞拍。
      

  10.   

    可以考虑在B表加个触发器,B表每入一条记录就相应更新A表。
      

  11.   

    仔细看了下你的需求,如果要加触发器,还得在A表加个字段存最大竞拍价格(比如字段名为max_price),这样方便判断。
    触发器大致如下
    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 ;
      

  12.   


    哦,触发器,其实也是要执行两条sql
    如果用户出价时,直接也执行两条sql,效率应该差不多吧?
    那就没有必要搞触发器了
      

  13.   

    另外,你3楼的方法(或如20楼所说用触发器),
    虽然每次插入的时候多了一条sql,但是在拍卖结束前,每次查询当前最高出价时,不需要再连接B表查,所以也很难说谁的效率更好,因为这个查询使用率很高,
    (每次用户来到该页面都会运行该sql,而出价的人相对少很多)当然这个要看你的具体页面,如果同一页面上有详细出价记录,也可以省掉该查询...还是那句,看你的具体情况....