+ -
当前位置:首页 → 问答吧 → 请教高手:如何获取数据表中的首位两条数据

请教高手:如何获取数据表中的首位两条数据

时间:2011-08-01

来源:互联网

数据库中有个表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时获取第一条和最后一条数据 请问 这该怎么实现,谢谢!!

作者: taiyangzhiya   发布时间: 2011-08-01

不好意思 标题打错了 是首尾两条数据

作者: taiyangzhiya   发布时间: 2011-08-01

没人回答吗........

作者: taiyangzhiya   发布时间: 2011-08-01

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

作者: lxq19851204   发布时间: 2011-08-01

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

作者: wwwwb   发布时间: 2011-08-01

3, 4楼的妙解

作者: iihero   发布时间: 2011-08-01

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

作者: wwwwb   发布时间: 2011-08-01

引用 3 楼 lxq19851204 的回复:

SQL code
Select * From 表a limit 1
union all
(select * from 表a order by time desc limit 1)
感谢,但是这只是查找出数据表中存在的第一条和最后一条 ,并没有说区域变化的时候查询出不同区域的第一条和第二条。我想实现的是显示一天当中,某个人在各个区域的时间的首尾两条数据,比如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-....

作者: taiyangzhiya   发布时间: 2011-08-01

引用 6 楼 wwwwb 的回复:

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
……
感谢,能否解释一下

作者: taiyangzhiya   发布时间: 2011-08-01

什么地方不明白

作者: wwwwb   发布时间: 2011-08-01

引用 9 楼 wwwwb 的回复:

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

作者: taiyangzhiya   发布时间: 2011-08-01

set 是设置变量赋值。
@是用户级变量。

看MYSQL官方手册吧。

作者: ACMAIN_CHM   发布时间: 2011-08-01

引用 10 楼 taiyangzhiya 的回复:
引用 9 楼 wwwwb 的回复:

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

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

作者: wwwwb   发布时间: 2011-08-01

SQL code
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)

作者: ACMAIN_CHM   发布时间: 2011-08-01

引用 13 楼 acmain_chm 的回复:

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

作者: taiyangzhiya   发布时间: 2011-08-01

这是就是举每段的首尾,建议你试一下。


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

 

作者: ACMAIN_CHM   发布时间: 2011-08-01

4楼的代码测试没有

作者: wwwwb   发布时间: 2011-08-01

一开始的列表:
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

作者: taiyangzhiya   发布时间: 2011-08-01

引用 16 楼 wwwwb 的回复:

4楼的代码测试没有
不好意思,还没测试,因为13楼的比较懂一些,就先测试13楼的了

作者: taiyangzhiya   发布时间: 2011-08-01