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