数据库的一道面试题 请个高手进!
说明:一个签到系统,2张表1个为user表,另一个为sign表
user (id,username,password,name,power)
sign (id, userid,signTime)
签一次到向sign表插入一条数据
我的问题:
我想查询 2007-07-02 到 2007-07-30 签到记录
条件是,
按每一天来分组显示,每一组把user表所有的用户都列出来(有的用户可能有一天没签到 但也要显示出username的值,只是不显示signtime列的值)
请大侠们指教!!
------解决方案--------------------不知道你说的是不是这个意思:
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-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
我相信是这意思
------解决方案-------------------- 鄙视一下楼主。都写出来了,不就一个(+)和to_date不一样吗
饭来张口衣来伸手的行为
------解决方案--------------------关键是实现的思想,鄙视楼主,自己应该 多动动脑子
------解决方案--------------------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
------解决方案--------------------可以不用临时表,但是你要创建datatable,在datatable里操作数据,还要用到hashtable,比较烦。
------解决方案--------------------你把他们写的语法,封装到存储过程中,再用JAVA 调用存储过程 不就行了吗?(我搞C# 不熟悉JAVA 但我想原理,不会差到千里)
------解决方案--------------------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
------解决方案--------------------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