1 要求必须完全在mysql下实现?我觉得用text类型存就可以,或者用varchar也行。如果mysql也有php一样的函数explode()可以轻松吧这个字符串装入数组,然后利用mysql的字符串处理函数将每个元素再用explode分割下装入个数组。然后再与当前时间进行比较就好了。
也就是说10:22-10:50,13:00-14:11,15:30-15:55先被拆成了
Array ( [0] => 10:22-10:50 [1] => 13:00-14:11 [2] => 15:30-15:55 )
然后再被拆成
Array ( [0] => 10:22 [1] => 10:50 ) Array ( [0] => 13:00 [1] => 14:11 ) Array ( [0] => 15:30 [1] => 15:55 )然后把判断语句写在trigers里面应该就可以了吧。

解决方案 »

  1.   

    第一个。
    你使用另外一个表来记录时间段吧。与原表是一对多的关系。使用text是不合理的,那样索引没法做了,除非数据量极少,不然……
      

  2.   

    trigers是什么??楼上的这样了必须从表中取出来用PHP再过滤,的确是可以。
    我现在想尽量直接在表里搞定,免得取得的记录过于庞大。
      

  3.   

    Gdj(陈水.智商只有129.非卖品) ( ) 信誉:100    Blog  2006-10-18 16:32:00  得分: 0  
     
     
       第一个。
    你使用另外一个表来记录时间段吧。与原表是一对多的关系。使用text是不合理的,那样索引没法做了,除非数据量极少,不然……
      
     
    这样子SELECT的时候似乎不太好比较是否在某时间段里。
      

  4.   

    第二个。你首先在php中生成一个数,1-10的,生成的概率按你的要求来生成,这个不难,不多说了。select * from table where r=$rand order by rand()
      

  5.   

    1、BETWEEN
    ... time BETWEEN '10:22' AND '10:50' or time BETWEEN '13:00' AND '14:11' 
    在可动态修改的系统中,若不想动态生成查询指令可建一表罗列许可的时间,在查询时关联
    以秒为分辨率至多也就86400条记录。2、ORDER
    ... ORDER BY 概率 desc, rand()
    若仅10必须每次都出现,则
    ... ORDER BY 概率=10 desc, rand()
      

  6.   

    select * from table where r=$rand order by rand() limit 1
      

  7.   

    sorry,写错了,应该是triggers触发器,你不是想当当前时间等于那些时间段的时候自动取出数据嘛?用触发器和存储过程应该是最好的选择。mysql虽然也有处理字符串的函数,但肯定没有php这么方便,既然要在mysql中处理,主要问题应该放在存储格式这里,这种存储格式用mysql的函数肯定不好拆。
    Gdj(陈水.智商只有129.非卖品)方法应该可以,用另一个表来存储这些时间段,字段可以有起始时间10:22,结束时间10:50,然后将上个id号与你那个表进行关联,多个时间段就存储多条数据,形成1对多关系。这样就不用拆数据了,在判断语句上会很好写了。
      

  8.   

    SELECT '10:52'
    BETWEEN substring( '10:50-10:55', 1, locate( '-', '10:50-10:55' ) -1 ) AND substring( '10:50-10:55', locate( '-', '10:50-10:55' ) +1 ) 这是我想到的一个示例语句,假设10:52为当前时间,表里设置了一个'10:50-10:55'的时间段。也正是唠叨的想法,现在问题是如何取这个时间段。
    但两个以上就不知道怎么整了。
    正如青春所说,主要是时间段存储格式问题。谢谢唠叨的第二个排序,我会试一下的。。
      

  9.   

    对于第一个问题,你并没有理解我的意思
    说明一下
    建立 时间过滤表
    CREATE TABLE `时间过滤表` (
      `time` time NOT NULL default '00:00:00',
      `bs` tinyint(4) NOT NULL default '0'
    )
    可预置00:00:00 - 23:59:59的全部时间,共86400条记录
    若只需要精确到分,则只需1440条记录根据过滤的要求设置字段bs的值查询时只需
    select * from 数据表 a, 时间过滤表 b where DATE_FORMAT(a.date, '%H:%i:%s')=b.time and bs=1
      

  10.   

    是不是我没有表达清楚呢??
    老大这样子,似乎是对应哪个时间点。
    而且时间过滤表里面并没有时间段,以where DATE_FORMAT(a.date, '%H:%i:%s')=b.time and bs=1为条件,不能确定时间段吧。
    1、BETWEEN
    ... time BETWEEN '10:22' AND '10:50' or time BETWEEN '13:00' AND '14:11' 你这个已经合我意了。现在要是展开来多个时间段如何存储能搞定的话,一切就OK了。
    2、ORDER
    ... ORDER BY 概率 desc, rand()
    若仅10必须每次都出现,则
    ... ORDER BY 概率=10 desc, rand()上面这两个试过了,概率字段为数字,第一个语句并不能实现随机,去掉RAND()结果是一样的。
    后面这个倒是可以随机,概率值为10的确实固定在最前面,后面的那些能根据概率值的大小来区分出现次数吗?
      

  11.   

    ... ORDER BY 概率 desc, rand()
    实现的是:结果集按“概率”排序,当“概率”相同时按rand()排序
    请注意观察
    是的,时间过滤表里面并没有时间段,是对应哪个时间点 的
    请注意:若干时间点就组成了时间段时间过滤表
    time     bs
    10:10:00 0
    10:11:00 1
    10:12:00 1
    10:13:00 1
    10:14:00 0
    就表示10:11 - 10:13时间段若数据表中的data为2006-10-18 10:12:03
    则 DATE_FORMAT(a.date, '%H:%i:00') 为 10:12:00不用我多说了吧?
      

  12.   

    谈谈第二个,
    0-10应该设定一个出现概率的表.
    比如 0不出现,10必定出现, 即 0=>0, 1=>0.1, 2=>0.2, ..... 9=>0.9, 10=1
    用公式来表示就是 rate/10 (rate即表中记录概率的字段)
    然后用这个表(公式)计算出0(不出现),或1(出现),当然公式可以调整.select * from table where rand()<=(rate/10)  即可.因为rand()是<=1的,所以,rate=10的必定出现, 
                           rate=9的出现概率为90%
                          ....(不过这里0实际上可能出现,因为rand()是>=0的,不过可能性很小,如果要避免,设0=>-1即可)公式可以用case语句,那么任何对应关系都可以表达出来了.
      

  13.   

    ... ORDER BY 概率 desc, rand()
    实现的是:结果集按“概率”排序,当“概率”相同时按rand()排序
    请注意观察
    ===================
    记录很多的时候,如果概率值最大为10,且有十条概率为10的记录,按这种排序我只要前5条记录,那前五条不都是概率值最大的那几条了?
    至于那个时间段的限制,现在暂时精确到小时,我在语句里加一个条件就OK。FIND_IN_SET(DATE_FORMAT(NOW(), '%k'), display_hour)>0其中display_hour的结构为:2,5,6,7,8,10
    只要现在的时间小时数可以在字段中找到,那么就会显示记录。。
    所以唠叨大哥用一个data为2006-10-18 10:12:03的字段,似乎不太适合我的要求,真是不好意思,应该是我没有表达清楚,或者是我真的还没有理解进来。
    继续讨论要是精确到分,是否还是可以您说的这样子呢?
    helloyou0的这种方法真的很不错,想起来符合要求哦,太感谢你了。
    你说的0不出现的问题,其实加一个条件就OK了,你觉得呢?
      

  14.   

    第一个看明白点了,
    看这样存如何?时间段time表:(其中itemid来自你的原来的表(假设为item表))
    id  itemid   time_from                   time_to
    1    111     2006-01-13 12:30:00   2006-01-14 03:33:01
    2    323     2006-02-14 16:31:00   2006-02-14 16:33:05
    3    323     2006-02-19 13:30:00   2006-02-20 13:32:07
    ...select * from item i , time t 
     where i.id = t.itemid 
      and ( now() between time_from and time_to ) 
    这样就可以了.关于第二点,
     实际上这个表里的rate字段应该是有一个实际对应的出现概率的,我上面例子里写得就是
       出现概率=rate/10,
     这个公式你可以调整成任何需要的,
       比如 
       出现概率=(rate/10)^2 , 这样的曲线就不是线性的而是二次的了,具体概率相对前一个更低. 
       也可以设为完全离散的,用数组形式:(这个毫无规律可言)
       $ar=array(0=>0.1,  1=>0.33,  2=>0.56,  3=>0.9,  4=>0.3) 
       出现概率= $ar[ rate ]
      
      有公式直接可以把公式写进sql,
      数组型的可以用case   select * from table where rand()<=( case rate when 0 then 0.1 
                                                     when 1 then 0.33
                                                     when 2 then 0.56
                                                     when 3 then 0.9
                                                     when 4 then 0.3
                                           end 
                                         )
       这样就可以了