您的位置:程序门 -> java -> web 开发



数据库的一道面试题 请个高手进!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


数据库的一道面试题 请个高手进!
发表于:2007-07-30 14:50:32 楼主
说明:一个签到系统,2张表1个为user表,另一个为sign表
user   (id,username,password,name,power)
sign   (id,   userid,signtime)
签一次到向sign表插入一条数据
我的问题:
我想查询   2007-07-02   到   2007-07-30   签到记录
条件是,
按每一天来分组显示,每一组把user表所有的用户都列出来(有的用户可能有一天没签到   但也要显示出username的值,只是不显示signtime列的值)  
请大侠们指教!!
发表于:2007-07-30 14:58:091楼 得分:0
条件写的再清楚写,
按每一天来分组显示,每一组把user表所有的用户和用户签到信息都列出来,显示这个用户的用户名,这一天的签到时间(有的用户可能有一天没签到   但也要显示出username,只是不显示signtime的值)
发表于:2007-07-30 15:35:492楼 得分:0
不知道你说的是不是这个意思:
select   t1.signtime,t2.name   from   sign   t1,user   t2  
where   t1.userid(+)=t2.id  
and   t1.signtime   between   to_date( '2007-07-02 ', 'yyyy-mm-dd ')   and   to_date( '2007-07-30 ', 'yyyy-mm-dd ')  
order   by   t1.signtime   desc
发表于:2007-07-30 15:46:283楼 得分:0
是sqlserver的数据库
发表于:2007-07-30 15:56:154楼 得分:0
你的查询结果相当于二纬数组,我觉得得分开一天天查,要是把所有用户的所有时间的登陆情况都一次统计出来好象不太可能,或许是我没想到,要是一天天分开查就简单了.
发表于:2007-07-30 15:57:265楼 得分:0
首先要把要把2007-07-02   到   2007-07-30   中间所有的日期都放到一个临时表searchdates里
然后:
  select   searchdates.dt,user.id,   user.username,user.passowrd,   user.name,user.power,sign.userid,sing.signtime
  from   user,   sign,   searchdates
  where   sign.id   =   user.id(+)
  and     searchdates.dt   =   sign.signtime(+)
  group   by   searchdates.dt

我相信是这意思
发表于:2007-07-30 16:04:106楼 得分:0
没得到答案   up   :)
发表于:2007-07-30 16:06:067楼 得分:0
晕,你仔细看别人的答案了么,浪费我的感情
发表于:2007-07-30 16:18:418楼 得分:0
请用sqlserver的写法
发表于:2007-07-30 16:20:529楼 得分:0
是不是要这样
user
1,a,password
2,b,password
3,c,password

sign
1,aid,2007-07-03
3,cid,2007-07-05

结果
2007-07-02,1,a,null
2007-07-02,2,b,null
2007-07-02,3,c,null
2007-07-03,1,a,2007-07-03
2007-07-03,2,b,null
2007-07-03,3,c,null
2007-07-04,1,a,null
...
2007-07-05,1,a,null
2007-07-05,2,b,null
2007-07-05,3,c,2007-07-05
...


发表于:2007-07-30 16:24:3910楼 得分:0
首先要把要把2007-07-02   到   2007-07-30   中间所有的日期都放到一个临时表searchdates里
然后:
  select   searchdates.dt,user.id,   user.username,user.passowrd,   user.name,user.power,sign.userid,sing.signtime
  from   user,   sign,   searchdates
  where   user   right   join   sing   on   sign.id   =   user.id
  and     sign   right   join   searchdates   on   searchdates.dt   =   sign.signtime
  group   by   searchdates.dt

我也不知道我这思路对不对,看来不像   是满足你的意思

要是对的话语法哪有错自己改一下吧,毕竟还是要自己学学的
发表于:2007-07-30 16:26:2311楼 得分:0
是的:请用sqlserver的写法     给出解答吧
发表于:2007-07-30 16:28:5312楼 得分:0


鄙视一下楼主。都写出来了,不就一个(+)和to_date不一样吗
饭来张口衣来伸手的行为
发表于:2007-07-30 16:31:3913楼 得分:0
先谢谢  
string   sql= "select   searchdates.dt,user.id,   user.username,user.passowrd,   user.name,user.power,sign.userid,sing.signtime
  from   user,   sign,   searchdates
  where   user   right   join   sing   on   sign.id   =   user.id
  and     sign   right   join   searchdates   on   searchdates.dt   =   sign.signtime
  group   by   searchdates.dt ";


可我想在java的rs   =   stmt.EXECutequery(sql)来得到数据   把生成临时表的语句也要放到sql中吗
发表于:2007-07-30 16:33:5414楼 得分:0
该回复于2007-12-28 11:42:04被管理员或版主删除
发表于:2007-07-30 16:40:0315楼 得分:0
好像不行,java里rs   =   stmt.EXECutequery(sql)只能有一个sql语句,有两个好像就要报错了,

还是事先弄一下或者找一个更好的办法吧
发表于:2007-07-30 17:00:0516楼 得分:0
想要的是这样的结果
user
1,a,password
2,b,password
3,c,password

sign
1,aid,2007-07-03
3,cid,2007-07-05

结果
2007-07-02,1,a,null
2007-07-02,2,b,null
2007-07-02,3,c,null
2007-07-03,1,a,2007-07-03
2007-07-03,2,b,null
2007-07-03,3,c,null
2007-07-04,1,a,null
...
2007-07-05,1,a,null
2007-07-05,2,b,null
2007-07-05,3,c,2007-07-05

但不用临时表   有好的sql语句吗?
发表于:2007-07-30 18:03:5217楼 得分:0
upppp
发表于:2007-07-30 18:06:4718楼 得分:0
关键是实现的思想,鄙视楼主,自己应该   多动动脑子

发表于:2007-07-31 08:34:1819楼 得分:0
dsoft555()   (   )   信誉:100     2007-7-30   16:33:54     得分:   0    
 
 
     
程序员总结开发的学习资料、实战项目代码

1.jsp编程技巧集锦139篇                                             50   元
2.asp编程技巧集锦(一个问题一段代码)                   40   元        
3.javascript编程技巧集锦(一个问题一段代码)     40   元
                                                                 
4.   网上书店系统(全套源码   安装即用)                     200元
5.   学生成绩管理系统(全套源码   安装即用)             200元
6.   oa-办公自动化系统(全套源码   安装即用)           300元  
7.   erp-产供销管理系统(全套源码   安装即用)         300元
8.   新闻发布管理系统(全套源码   安装即用)             200元
9.   学生选课管理系统(全套源码   安装即用)             200元
10.超市信息管理系统(全套源码   安装即用)             200元
                 

e_mail:fzlotuscn@yahoo.com.cn     qq:595563946      

掏宝地址:   http://shop34556665.taobao.com

   
 
发表于:2007-07-31 11:11:0520楼 得分:0
可以不用临时表,但是你要创建datatable,在datatable里操作数据,还要用到hashtable,比较烦。
发表于:2007-07-31 11:16:2121楼 得分:0
你把他们写的语法,封装到存储过程中,再用java   调用存储过程   不就行了吗?(我搞c#   不熟悉java   但我想原理,不会差到千里)
发表于:2007-07-31 11:27:3122楼 得分:0
select   *   from   usertable   left   outer   join   [sign]   on   usertable.id=[sign].userid   and   signtime <= '2007-07-02 '   and   signtime> = '2007-07-30 '   order   by   signtime   desc
发表于:2007-07-31 11:45:4723楼 得分:0
select   c.d,   c.id,   e.username,   d.signtime
from
(select   *   from
(select   distinct   convert(char(10),   signtime,   111)   as   d     from   sign)   a
cross   join   (select   id   from   user)   b)   c
inner   join   user   e   on   c.id   =   e.id
left   outer   join(
select   u.id,   u.username,   s.signtime
from   user   u
left   join   sign   s   on   u.id   =   s.userid)d   on   c.id   =   d.id   and   c.d   =   convert(char(10),   d.signtime,   111)
order   by   c.d,   c.id
发表于:2007-07-31 12:04:3024楼 得分:0
create   table   tb  

t1     varchar(10)   not   null
)
declare   @a               datetime,  
@end     datetime  
select     @a=             dateadd(yy,   datediff(yy,0,getdate()),   0)
select     @end   =   dateadd(ms,-3,dateadd(yy,   datediff(yy,0,getdate())+1,   0))
while(@a <   @end)
begin
insert   into   tb
values(convert(varchar(10),   @a,   112))
select   @a   =dateadd(day   ,   1,   @a)  
end


select   *   from     tb1
select   a.t1,user.id,user.username,sign.signtime
from   (select   t1   from   tb   where   t1   > = '20070702 '   and     t1   <= '20070730 '   )a,user
left   join   user.id   =   sign.userid
group   by   a.t1,user.id,user.username,sign.signtime
order   by   a.t1,user.id,user.username,sign.signtime

drop   table   tb
发表于:2007-07-31 13:58:4925楼 得分:0
up
发表于:2007-07-31 14:12:1626楼 得分:0
select   sign.signtime,t2.name   from
sign   right   join   user   on   sign.userid=user.id  
where  
sign.signtime   between   '2007-07-02 '   and   '2007-07-30 '
order   by   sign.signtime   desc
发表于:2007-07-31 15:42:2727楼 得分:0
你的意思是不是   把时间当条件传进去   一次次的把一天的数据检索出来然后在java里处理?
我认为应该是用他们的sql文   把所有的数据查出来   按时间排好   ,然后去rs里循环取,放到临时的数组里去处理
发表于:2007-07-31 15:56:3728楼 得分:0
欢迎女同胞加入女程序员qq群:43460515
发表于:2007-07-31 16:01:2729楼 得分:0
lz真牛x,同样的一个问题开了至少三个帖,不过这次把标题给改了,人气还蛮高的,超过了那两个的总和还多~~
发表于:2007-07-31 16:04:4430楼 得分:0
sunshinestation(阳光驿站)  
---------------------------
  在那个帖子里不是已经把方法都帖出来了么,我都验证过了。。晕~~

---sunshinestation(阳光驿站)   的方法:
select   c.d,   c.id,   e.username,   d.signtime
from
(select   *   from
(select   distinct   convert(char(10),   signtime,   111)   as   d     from   sign)   a
cross   join   (select   id   from   user)   b)   c
inner   join   user   e   on   c.id   =   e.id
left   outer   join(
select   u.id,   u.username,   s.signtime
from   user   u
left   join   sign   s   on   u.id   =   s.userid)d   on   c.id   =   d.id   and   c.d   =   convert(char(10),   d.signtime,   111)
order   by   c.d,   c.id


发表于:2007-07-31 16:11:5131楼 得分:0
最重要的---没见   lz   结过帖...
> _ <
发表于:2007-07-31 17:05:0232楼 得分:0
我是这么干的,也得到了lz需要的结果
create   table   [user](id   int,username   varchar(20),password   varchar(10),name   varchar(10),   [power]   int)

insert   into   [user]   values(1, 'a ', ' ', 'a ',1);
insert   into   [user]   values(2, 'b ', ' ', 'a ',1);
insert   into   [user]   values(3, 'c ', ' ', 'a ',1);
insert   into   [user]   values(4, 'd ', ' ', 'a ',1);

create   table   [sign](id   int,userid   int,signtime   datetime)
insert   into   [sign]   values(1,1,cast( '2007-07-01 '   as   datetime));
insert   into   [sign]   values(1,2,cast( '2007-07-02 '   as   datetime));
insert   into   [sign]   values(1,2,cast( '2007-07-03 '   as   datetime));
insert   into   [sign]   values(1,3,cast( '2007-07-31 '   as   datetime));


select   a.*   from   [user]   a   left   join   [sign]   b   on   a.id=b.userid   where   b.signtime> = '2007-07-02 '   and   b.signtime <= '2007-07-30 '   group   by   convert(varchar(10),b.signtime,20),a.id,a.username,a.password,a.name,a.power
发表于:2007-07-31 17:25:2433楼 得分:0
select   username,signtime   from   user   a   left   join   sign     b   on   a.id=b.id
发表于:2007-07-31 17:26:2134楼 得分:0
select   username,signtime   from   user   a   left   join   sign     b   on   a.id=b.id   where   b.signtime   2007-07-02   between   2007-07-30     order   by   signtime
发表于:2007-07-31 17:40:2235楼 得分:0
写个存储过程
设个变量time   初始化为   2007-07-02
直到2007-07-30
具体怎么写记不清了  
查询语句下面这个意思估计可以
select     time,userid,username,signtime
from   user   u   left   join   sign   s   on   u.id=s.userid
where   signtime=time
发表于:2007-08-01 13:29:4336楼 得分:0
没得到正确的结果,继续up
发表于:2007-08-01 15:55:0137楼 得分:0
还up什么啊~~!
楼上的这么多答案你到底试了没有啊?!?!
别太让人bs了,自己动脑子研究一下,
原理、方法都在那,细节上修改成自己所需要不就行了------非得让别人“帮”你写成现成的(事实上按你描述的,已经是现成的了)自己ctrl+c   ---> ctrl+v   就完事了??

为lz这样的人汗颜!!
-_-:
发表于:2007-08-03 19:14:2638楼 得分:0
等你得到正确的结果,盐都酸了,那么多高手详细的说明,你难道平时吃饭也是请别人喂的,汗


快速检索

最新资讯
热门点击