作者andreli (小狗跟正妹是我的死穴)
看板PHP
标题Re: [请益] MySql select 不同时间的比较
时间Fri Feb 25 23:17:11 2011
※ 引述《yuleen123 (.......................)》之铭言:
: ※ 引述《sunz5010 (FoFo)》之铭言:
: : 我想select一段资料
: : 姓名|日期|分数
: : -----------------
: : 小明|12/1|80
: : 大华|12/1|70
: : -----------------
: : 小明|11/1|70
: : 大华|11/1|75
: : -----------------
: : 小明|10/1|60
: : 大华|10/1|80
: : 我想找出
: : 12/1分数>11/1分数>10/1分数 的人
: : 按照上面的数据、他应该会搜寻出小明
: : 因为小明(12/1,80)>(11/1,70)>(10/1,60)
: : 想请问一下、这样子mysql的语法应该怎麽下呢
: 我照你的格式建了一张表来测试,如下
: mysql> select * from test01;
: +------+-------+-------+
: | name | date | score |
: +------+-------+-------+
: | AA | 12/01 | 80 |
: | BB | 12/01 | 70 |
: | AA | 11/01 | 70 |
: | BB | 11/01 | 75 |
: | AA | 10/01 | 60 |
: | BB | 10/01 | 80 |
: +------+-------+-------+
: 6 rows in set (0.00 sec)
: 使用以下的 SQL 叙述
: select
: name
: from
: test01 as m
: where
: (select score from test01 as a where date='12/01' and m.name=a.name) >
: (select score from test01 as b where date='11/01' and m.name=b.name)
: and
: (select score from test01 as c where date='11/01' and m.name=c.name) >
: (select score from test01 as d where date='10/01' and m.name=d.name)
: group by name
: 结果如下:
: +------+
: | name |
: +------+
: | AA |
: +------+
: 1 row in set (0.00 sec)
: 或许语法不是很高明,不过确实可以达成目的
我刚刚想了一下, 如果是要确认某个人是不是都一直进步,
那麽多加一个差值的栏位(每一次插入的时候跟上一次比较)是不是会有效率多了?
因为感觉上如果日期一多, 人一多, 暴力法一一比对很恐怖...
+------+-------+-------+------+
| name | date | score | diff |
+------+-------+-------+------+
| AA | 12/01 | 80 | 10 |
| BB | 12/01 | 70 | -5 |
| AA | 11/01 | 70 | 10 |
| BB | 11/01 | 75 | -5 |
| AA | 10/01 | 60 | 0 |
| BB | 10/01 | 80 | 0 |
+------+-------+-------+------+
如果多了一个差值栏位, 那就只要select所有的人当中diff没有负值(也就是都>=0)
就会是所选的人了...
不知道这样的做法有没有其他瑕疵我没考虑到的,
不过不能加栏位的话当我没说, 也希望有前辈可以分享一下作法。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.248.106.146
1F:→ arrack:这只能比较出一天的差异,原PO想要多天的 02/25 23:22
2F:→ andreli:我有说前提...如果原po是想找成绩一直往上的或一直往下的 02/25 23:24
3F:→ andreli:所以我的方法所以还是要看原po的真正case 02/25 23:27