sql提取数据的问题
csinfo_work 工作日志表结构如下
------------------------------
id|username|content
------------------------------------
csinfo_plun 评论表结构如下
---------------------------------
id|work_id|content|p_name|p_time
-----------------------------------
评论表中的ID是标识递增的,work_id是程序写进去的,实际上是csinfo_work表中的ID,因为一篇日志可能很多个人,多篇评论, p_name是写的评论人的名字,在实际应用中,csinfo_plun.p_name=csinfo_work.username的时候叫做反馈的信息,因为评论人等于发布这篇日志的作者,而csinfo_plun.p_name<>csinfo_work.username叫做领导的点评信息
-----------------------------------
需求:
需要在获得在3天以内的,在自己写过反馈后的所有点评信息和点评的总数
-------------------------------------
在此感谢dawugui的帮助,通过他的解答,以下sql可以提取出最新一条点评信息
----------------------------------------
select t1.id,t1.work_id,t1.p_time,t1.p_name from (select n.* from csinfo_work m , csinfo_plun n where m.id = n.work_id and m.username = '张三' and datediff(day,n.p_time,getdate())<= 3) t1 where p_time = (select max(p_time) from (select n.* from csinfo_work m , csinfo_plun n where m.id = n.work_id and m.username = '张三' and datediff(day,n.p_time,getdate())<= 3) t2 where t2.work_id = t1.work_id) group by t1.id,t1.work_id,t1.p_time,t1.p_name
select distinct ta.id, ta.work_id,cast(ta.content as varchar(8000)) as content,ta.p_name,ta.p_time from csinfo_plun ta,(select a.* from csinfo_plun a,csinfo_work b where a.p_name=b.username) tbwhere ta.work_id=tb.work_id and ta.p_time>tb.p_time and datediff(day,tb.p_time,ta.p_time)<=3/**id work_id content p_name p_time ----------- ----------- ---------------------------------------------------------------------------------------------------------------- -------- ------------------------------------------------------ 3 1 睡了起来再吃点 王麻子 2009-02-28 00:22:34.0004 1 睡了起来再吃点 王麻子 2009-02-28 00:23:34.0008 3 睡了起来再吃点 王麻子 2009-02-28 00:27:34.000(所影响的行数为 3 行)**/
[解决办法]
如果把测试数据中的:insert into csinfo_plun(work_id,content,p_name,p_time)values(3,'大家都吃饱了','张三','2009-02-28 00:26:34')改为insert into csinfo_plun(work_id,content,p_name,p_time)values(3,'大家都吃饱了','李四','2009-02-28 00:26:34')那么结果正确.
------解决方案--------------------
我明白LZ的意思了
有两种情况
1.比如说普通的人写了一篇日志,领导应该先对你的日志进行点评,然后写日志的人对领导的点评再进行反馈
2.如果自己在领导点评的基础上又反馈,领导再次点评的时候,dawugui写的代码正确
在第一种情况的时候plun表中的p_name可能没有work表中的username
select t1.* from csinfo_plun t1 ,
(select n.* from csinfo_work m , csinfo_plun n where m.id = n.work_id and m.username = n.p_name) t2
where t1.work_id = t2.work_id and t1.p_name <> t2.p_name and datediff(day , t1.p_time , t2.p_time) <= 3 and t1.p_time > t2.p_time
m.username = n.p_name 条件也就不能成立
第二种情况上面的代码显示没问题