数据库中有个表a,它里面的数据是
区域        时间        内容
area        time        context
A           8:00         1
A           8:01         2
...
A           9:00         1
B           9:01         2
B           9:02         1
...
B           9:10         2
A           9:11         1
...
我想获得表a中在A区域的第一条和最后一条数据,也就是A    8:00   1~   A     9:00    1,当区域变成B时获取同理B区域的第一条和最后一条数据,当又变成A时获取第一条和最后一条数据  请问  这该怎么实现,谢谢!!

解决方案 »

  1.   

    Select * From 表a limit 1
    union all
    (select * from 表a order by time desc limit 1)
      

  2.   

    SET @a=0;
    SET @b='';
    SELECT bz,MAX(TIME),MIN(TIME) FROM (
    SELECT *,@a:=IF(@b=`area`,@a,@a+1) AS bz,@b:=`area` FROM tth) a GROUP BY bz
      

  3.   

    4楼的代码 假设你的时间按时间排序,如果没有 顺序,加入自增字段ID,SELECT * FROM TTH C LEFT JOIN (
    SELECT bz,MAX(ID) AS MA ,MIN(ID) AS MI FROM (
    SELECT *,@a:=IF(@b=`area`,@a,@a+1) AS bz,@b:=`area` FROM tth) a GROUP BY bz) D
    ON C.ID=D.MA
    LEFT JOIN TTHC E ON E.ID=D.MI
      

  4.   

    感谢,但是这只是查找出数据表中存在的第一条和最后一条 ,并没有说区域变化的时候查询出不同区域的第一条和第二条。我想实现的是显示一天当中,某个人在各个区域的时间的首尾两条数据,比如8-1到8-2在A区8:00-9:00,然后在B区9:01-9:10,接着又在A区9:11-...,列出表
    区域      时间段     
    A        8:00-9:00
    B        9:01-9:10
    A        9:11-....
      

  5.   

    因为偶还是菜鸟,对set和@的用法不明白
      

  6.   

    set 是设置变量赋值。
    @是用户级变量。看MYSQL官方手册吧。
      

  7.   

    简单地说,对变量赋值,将所有AERA相同的记录归为1组 
      

  8.   

    select * from 数据库中有个表a t
    where a.area != (select area from 数据库中有个表a where 时间<a.时间 order by 时间 desc limit 1)
    or a.area != (select area from 数据库中有个表a where 时间>a.时间 order by 时间 limit 1)
      

  9.   

    大虾,你写的是不是这个意思:查询数据表中在某个时间范围内的第一条和最后一条数据?
    因为表中的数据是时刻在变化的,所以 where 时间>a.时间   时间并不能写固定的,我放了个combobox控件来选择时间,比如今天8:00-10:00 ,然后得出在这段时间内处于A区,B区,A区,...等的首尾两条数据。
      

  10.   

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

  11.   

    一开始的列表:
    A    8:00..
    A    8:01..
    ...
    A    9:00..
    接下来跳到B区了
    B    9:01
    B    9:02
    ...
    B    9:10
    接下来又回到A区了
    A:   9:11
    ...
    要实现的结果列表:
    A   8:00  -9:00
    B   9:01  -9:10
    A   9:11  -10:00
      

  12.   

    能不能大致解释一下from(),括号里面的内容,谢谢大虾了
      

  13.   

    对变量赋值,将所有AERA相同的记录归为1组,自己试试,就知道了
      

  14.   

    提供你的create table ,INSERT INTO语句以供别人测试。
      

  15.   

    怎么没有
    mysql> SET @a=0;
    Query OK, 0 rows affected (0.00 sec)mysql> SET @b='';
    Query OK, 0 rows affected (0.00 sec)mysql> SELECT bz,`AREA`,MAX(TIME),MIN(TIME) FROM (
        -> SELECT *,@a:=IF(@b=`area`,@a,@a+1) AS bz,@b:=`area` FROM tth) a GROUP BY
    bz,`AREA`;
    +------+------+-----------+-----------+
    | bz   | AREA | MAX(TIME) | MIN(TIME) |
    +------+------+-----------+-----------+
    |    1 | A    | 09:00:00  | 08:00:00  |
    |    2 | B    | 09:10:00  | 09:01:00  |
    |    3 | A    | 09:11:00  | 09:11:00  |
    +------+------+-----------+-----------+
    3 rows in set (0.00 sec)mysql>
      

  16.   


    area time context
    A 8:00 1
    A 8:01 2
    ...
    A 9:00 1
    B 9:01 2
    B 9:02 1
    ...
    B 9:10 2
    A 9:11 1
    测试
      

  17.   

         With X as   --CTE递归        
          (      
               Select *, row_number() over(order by 你的表Id) as rowNum  
               From 你的数据表
          )  
            select * from X   
            where rowNum =1 or rowNum =Max(rowNum)