MySQL表:tmp_table有下列数据:date    name   score   interval_date
2010-3-19  A    210     1
2010-3-17  A    180     2
2010-3-16  A    220     3
2010-3-15  A    230     4
……
2010-3-19  B    180     1
2010-3-18  B    250     2
2010-3-16  B    120     3
2010-3-15  B    230     4
……
2010-3-19  C    255     1
2010-3-18  C    250     2
2010-3-17  C    120     3
2010-3-16  C    230     4
……求:实现  各人(name)的历史分数(score)中比今日(date='2010-3-19')分数更大、离今日(date='2010-3-19')最近的那条记录的date和interval_date值。如无,则返回今日(date='2010-3-19')的interval_date值  的查询语句上述举例数据经查询后应返回如下:name  date     interval_date
A   2010-3-16    3
B   2010-3-18    2
C   2010-3-19    1 另:1、date中的日期并非都连续的;
  2、该表数据量较大。

解决方案 »

  1.   


       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式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)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  2.   

    create table if not exists `t1` (
      `date` date not null,
      `name` varchar(255) not null,
      `score` int(11) not null,
      `interval_date` int(11) not null
    ) engine=myisam default charset=gbk;insert into `t1` values ('2010-03-19', 'A', 210, 1);
    insert into `t1` values ('2010-03-17', 'A', 180, 2);
    insert into `t1` values ('2010-03-16', 'A', 220, 3);
    insert into `t1` values ('2010-03-15', 'A', 230, 4);insert into `t1` values ('2010-03-19', 'B', 180, 1);
    insert into `t1` values ('2010-03-18', 'B', 250, 2);
    insert into `t1` values ('2010-03-16', 'B', 120, 3);
    insert into `t1` values ('2010-03-15', 'B', 230, 4);insert into `t1` values ('2010-03-19', 'C', 255, 1);
    insert into `t1` values ('2010-03-18', 'C', 250, 2);
    insert into `t1` values ('2010-03-17', 'C', 120, 3);
    insert into `t1` values ('2010-03-16', 'C', 230, 4);要得到:name  date     interval_date
    A   2010-3-16    3
    B   2010-3-18    2
    C   2010-3-19    1 即: 各人(name)的历史分数(score)中比今日(date='2010-3-19')分数更大、离今日(date='2010-3-19')最近的那条记录的date和interval_date值。如无(即今日的score最大),则返回今日(date='2010-3-19')的date和interval_date值
      

  3.   

    SQL语句可以如下实现,但 "2、该表数据量较大。" 则不如通过存储过程来实现。
    mysql> select name,`date`,interval_date
        -> from(
        -> select name,`date`,interval_date
        -> from t1 t
        -> where `date`<='2010-03-19'
        -> and score>=(select score from t1 where name=t.name and `date`='2010-03-19')
        -> order by name,`date`='2010-03-19',`date` desc
        -> ) x
        -> group by name;
    +------+------------+---------------+
    | name | date       | interval_date |
    +------+------------+---------------+
    | A    | 2010-03-16 |             3 |
    | B    | 2010-03-18 |             2 |
    | C    | 2010-03-19 |             1 |
    +------+------------+---------------+
    3 rows in set (0.00 sec)mysql>
      

  4.   

    3楼的答案的确能实现举例中的数据。万分感谢!但在我的机器、实际的表中运行,那便万万不行了。在MySQL设置不变和表结构、索引、数据不变的前提下,用PHP通过逐一的name进行比较进而得出数据,再保存到新表中,200多万条记录、2000多条name,在我的机器用了10多秒完成,但运行3楼的查询语句,系统进入假死机状态,等了40多秒还是看不到出结果的希望…