这句SQL语句该怎么写,请教高手!

maoziheng 2012-07-02 04:06:58
数据库里有每个用户发布的产品,每个用户都可以发布多条产品。产品发布后用户在后台可一次更新一条产品的发布时间,也可以一键更新全部产品的发布时间,此时用户发布的产品全部时间都相同,如下表中的用户ID:9,


我现在想从这个表中每个对应用户都只提取出一条产品显示,提取出的产品要求:1、是用户最新发布或更新的那条产品,
2、如果用户是一键更新过的那条产品,所有产品时间都是相同的,那么在这样情况下就提取它ID最大产品,请问该如何写这句SQL语句

产品编号 对应用户ID 发布时间
SMT_id dyid SMT_data
1 9 2012-4-12 14:33:36
2 11 2012-4-18 19:23:36
3 9 2012-4-12 14:33:36
4 9 2012-4-12 14:33:36
5 12 2012-5-19 19:23:36
6 11 2012-3-17 19:23:36

想要的结果

产品编号 对应用户ID 发布时间
SMT_id dyid SMT_data
5 12 2012-5-19 19:23:36
2 11 2012-4-18 19:23:36
4 9 2012-4-12 14:33:36
...全文
384 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
maoziheng 2012-07-05
  • 打赏
  • 举报
回复
上面的答案都不是我要的,试了都不对,很感谢大家帮忙,我还是重新开贴,把问题描述清楚,可能我说的不清楚
Lyongt 2012-07-03
  • 打赏
  • 举报
回复

Declare @Tb TABLE ([SMT_id] INT,[dyid] INT,[SMT_data] DATETIME)
INSERT Into @Tb
SELECT 1,9,'2012-4-12 14:33:36' UNION ALL
SELECT 2,11,'2012-4-18 19:23:36' UNION ALL
SELECT 3,9,'2012-4-12 14:33:36' UNION ALL
SELECT 4,9,'2012-4-12 14:33:36' UNION ALL
SELECT 5,12,'2012-5-19 19:23:36' UNION ALL
SELECT 6,11,'2012-3-17 19:23:36'
--------------开始查询--------------------------
Select * From @Tb

Select MAX(T1.SMT_id) As SMT_id , T1.dyid, T1.SMT_data
From @Tb T1 , (Select dyid, MAX(SMT_data) As SMT_data From @Tb
Group By dyid) T2
Where (T1.dyid = T2.dyid And T1.SMT_data = T2.SMT_data)
Group By T1.dyid, T1.SMT_data
Order By T1.SMT_data Desc
Lyongt 2012-07-03
  • 打赏
  • 举报
回复
Select MAX(T1.SMT_id) As SMT_id , T1.dyid, T1.SMT_data
From @Tb T1 , (Select dyid, MAX(SMT_data) As SMT_data From @Tb
Group By dyid) T2
Where (T1.dyid = T2.dyid And T1.SMT_data = T2.SMT_data)
Group By T1.dyid, T1.SMT_data
Order By T1.SMT_data Desc
zhaopinde 2012-07-03
  • 打赏
  • 举报
回复
楼主给你补充一下
时间是date 不是data
SMT_date○
SMT_data×
zhaopinde 2012-07-03
  • 打赏
  • 举报
回复
select tb1.SMT_id , tb1.dyid , tb1.SMT_date
from (select SMT_id , dyid , SMT_date from tb order by SMT_date desc, SMT_id desc) tb1
group by dyid
luochaowei1987 2012-07-02
  • 打赏
  • 举报
回复
select Max(id),dyid,MAX(data) from #T0702 group by dyid
这个行不行呀
maoziheng 2012-07-02
  • 打赏
  • 举报
回复
虽然整个查询语句比较长,但是并不复杂,有些内容可以忽略,期待高手能帮忙解决,万分感谢。。。
maoziheng 2012-07-02
  • 打赏
  • 举报
回复
非常感谢楼上各位的热心帮助

不过我试了好几次代替到我的那个语句里都不正确。这是我的整个查询语句:
<%sql="select SMT_cp.SMT_id as cpid,SMT_cp.SMT_sortid,SMT_cp.SMT_cpjm,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpjgdw,SMT_cp.SMT_cpname,SMT_cp.SMT_cpjl,SMT_cp.SMT_yp_id,SMT_cp.SMT_pic,SMT_yp.paixu,SMT_yp.SMT_id,SMT_yp.SMT_user,SMT_yp.SMT_coname,SMT_yp.SMT_qyqq,SMT_yp.SMT_addtwo_id,SMT_yp.SMT_co,SMT_yp.SMT_vip,SMT_cp.SMT_date,0 as px from SMT_cp,SMT_yp where SMT_cp.SMT_id in (select max(SMT_cp.SMT_id) from SMT_cp Where 1=1 group by SMT_cp.SMT_yp_id )"&cjsort&" "&addsort&"and SMT_cp.SMT_yp_id=SMT_yp.SMT_id and (SMT_yp.SMT_vip<=5) and SMT_yp.SMT_key=1 union all select SMT_cp.SMT_id as cpid,SMT_cp.SMT_sortid,SMT_cp.SMT_cpjm,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpjgdw,SMT_cp.SMT_cpname,SMT_cp.SMT_cpjl,SMT_cp.SMT_yp_id,SMT_cp.SMT_pic,SMT_yp.paixu,SMT_yp.SMT_id,SMT_yp.SMT_user,SMT_yp.SMT_coname,SMT_yp.SMT_qyqq,SMT_yp.SMT_addtwo_id,SMT_yp.SMT_co,SMT_yp.SMT_vip,SMT_cp.SMT_date,1 as px from SMT_cp,SMT_yp where SMT_cp.SMT_yp_id=SMT_yp.SMT_id and SMT_yp.SMT_key=1 order by px,SMT_yp.paixu,SMT_cp.SMT_date DESC"

我们上面讨论的就是要在我SQL语句红色部分替换的,这句SQL语句就是查询 SMT_cp(产品)和SMT_yp(用户) 这两个表进行联合查询,原先想要得到的结果是

先查询并先显示出每个用户发布的最后一个ID最大的产品 再查询显示每个用户的所有产品,用以上代码能打动效果


现在,我想进行修改,想得到的结果是

先查询并显示每个用户在后台更新的时间最新的一个产品(后台用户可更新当个产品,也可以一次性更新自己发布的全部产品,所以在SMT_cp表里当用户一次性更新所有产品SMT_date字段更新时间是完全相同的),在这里优先显示最新更新的产品,如果这个用户产品发布时间都相同就取ID最大那个产品, 然后在显示产品。

同时两个表里有些字段的名称是相同的,比如SMT_date,SMT_id等字段两个表都有这样字段,但针对内容不同,需要区分。


这个问题已经困扰我很久了,如能解决我愿追加所有的分数,希望哪位好心大哥耐心看下能否解决!
maoziheng 2012-07-02
  • 打赏
  • 举报
回复
非常感谢楼上各位的热心帮助

不过我试了好几次代替到我的那个语句里都不正确。这是我的整个查询语句:
<%sql="select SMT_cp.SMT_id as cpid,SMT_cp.SMT_sortid,SMT_cp.SMT_cpjm,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpjgdw,SMT_cp.SMT_cpname,SMT_cp.SMT_cpjl,SMT_cp.SMT_yp_id,SMT_cp.SMT_pic,SMT_yp.paixu,SMT_yp.SMT_id,SMT_yp.SMT_user,SMT_yp.SMT_coname,SMT_yp.SMT_qyqq,SMT_yp.SMT_addtwo_id,SMT_yp.SMT_co,SMT_yp.SMT_vip,SMT_cp.SMT_date,0 as px from SMT_cp,SMT_yp where SMT_cp.SMT_id in (select max(SMT_cp.SMT_id) from SMT_cp Where 1=1 group by SMT_cp.SMT_yp_id )"&cjsort&" "&addsort&"and SMT_cp.SMT_yp_id=SMT_yp.SMT_id and (SMT_yp.SMT_vip<=5) and SMT_yp.SMT_key=1 union all select SMT_cp.SMT_id as cpid,SMT_cp.SMT_sortid,SMT_cp.SMT_cpjm,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpjgdw,SMT_cp.SMT_cpname,SMT_cp.SMT_cpjl,SMT_cp.SMT_yp_id,SMT_cp.SMT_pic,SMT_yp.paixu,SMT_yp.SMT_id,SMT_yp.SMT_user,SMT_yp.SMT_coname,SMT_yp.SMT_qyqq,SMT_yp.SMT_addtwo_id,SMT_yp.SMT_co,SMT_yp.SMT_vip,SMT_cp.SMT_date,1 as px from SMT_cp,SMT_yp where SMT_cp.SMT_yp_id=SMT_yp.SMT_id and SMT_yp.SMT_key=1 order by px,SMT_yp.paixu,SMT_cp.SMT_date DESC"

我们上面讨论的就是要在我SQL语句红色部分替换的,这句SQL语句就是查询 SMT_cp(产品)和SMT_yp(用户) 这两个表进行联合查询,原先想要得到的结果是

先查询并先显示出每个用户发布的最后一个ID最大的产品 再查询显示每个用户的所有产品,用以上代码能打动效果


现在,我想进行修改,想得到的结果是

先查询并显示每个用户在后台更新的时间最新的一个产品(后台用户可更新当个产品,也可以一次性更新自己发布的全部产品,所以在SMT_cp表里当用户一次性更新所有产品SMT_date字段更新时间是完全相同的),在这里优先显示最新更新的产品,如果这个用户产品发布时间都相同就取ID最大那个产品, 然后在显示产品。

同时两个表里有些字段的名称是相同的,比如SMT_date,SMT_id等字段两个表都有这样字段,但针对内容不同,需要区分。


这个问题已经困扰我很久了,如能解决我愿追加所有的分数,希望哪位好心大哥耐心看下能否解决!
  • 打赏
  • 举报
回复

--> 测试数据:[test]
if object_id('[test]') is not null
drop table [test]
create table [test](
[SMT_id] int,
[dyid] int,
[SMT_data] datetime
)
go
insert [test]
select 1,9,'2012-4-12 14:33:36' union all
select 2,11,'2012-4-18 19:23:36' union all
select 3,9,'2012-4-12 14:33:36' union all
select 4,9,'2012-4-12 14:33:36' union all
select 5,12,'2012-5-19 19:23:36' union all
select 6,11,'2012-3-17 19:23:36'
go


select * from test as a
where not exists(select 1 from test as b
where a.dyid=b.dyid and (a.SMT_data<b.SMT_data
or (a.SMT_data=b.SMT_data and a.SMT_id<b.SMT_id)))
--主意:我的表明后面你看都有一个as什么的,as后面的那个是给表取的别名,然后用别名标示字段,就表示这个字段是那个表的
/*
SMT_id dyid SMT_data
-------------------------------------------
2 11 2012-04-18 19:23:36.000
4 9 2012-04-12 14:33:36.000
5 12 2012-05-19 19:23:36.000
*/
maoziheng 2012-07-02
  • 打赏
  • 举报
回复
调试总是不对
产品编号 对应用户ID 发布时间
SMT_id dyid SMT_data
1 9 2012-4-12 14:33:36
2 11 2012-4-18 19:23:36
3 9 2012-4-12 14:33:36
4 9 2012-4-12 14:33:36
5 12 2012-5-19 19:23:36
6 11 2012-3-17 19:23:36
这个表是tb 那么[dyid]=t.[dyid]这里的t代表的是那个表?
  • 打赏
  • 举报
回复
在查询分析器运行一下语句,调试好了再往程序里面放
maoziheng 2012-07-02
  • 打赏
  • 举报
回复
[dyid]=t.[dyid] 这里的t是不是代表用户表SMT_yp表啊
maoziheng 2012-07-02
  • 打赏
  • 举报
回复
好的,我试试看
筱筱澄 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

本人愚笨,,调试了还是不对,我原来的SQL语句是这样的,是联合查询 SMT_cp产品表和SMT_yp用户表,第一次是查询出来的是每个用户ID最大一条产品,然后再查询每个用户所有产品,等每个用户ID最大一条产品显示完再显示的是全部产品,现在要改动的是红色部分,就是把查询每个用户ID最大一条产品改为查询每个用户更新时间最新的一条产品,但是更新的时间一键更新的话,时间是相同的,没法用max(),楼上各……
[/Quote]


你不就是要
SMT_cp.SMT_id in
(select max(SMT_cp.SMT_id) from SMT_cp Where 1=1 group by SMT_cp.SMT_yp_id )

你不就是想得到 in 里面的 SMT_id吗?
你下写把上面的 语句改写好了,然后把整个语句都放入到括号里面就ok了
maoziheng 2012-07-02
  • 打赏
  • 举报
回复
不知道怎么结合进去,您能看一下我整句SQL语句吗,大致看一下,我应该把红色部分怎么改
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

本人愚笨,,调试了还是不对,我原来的SQL语句是这样的,是联合查询 SMT_cp产品表和SMT_yp用户表,第一次是查询出来的是每个用户ID最大一条产品,然后再查询每个用户所有产品,等每个用户ID最大一条产品显示完再显示的是全部产品,现在要改动的是红色部分,就是把查询每个用户ID最大一条产品改为查询每个用户更新时间最新的一条产品,但是更新的时间一键更新的话,时间是相同的,没法用max(),楼上各……
[/Quote]

我六楼的语句你有没有试????
maoziheng 2012-07-02
  • 打赏
  • 举报
回复
本人愚笨,,调试了还是不对,我原来的SQL语句是这样的,是联合查询 SMT_cp产品表和SMT_yp用户表,第一次是查询出来的是每个用户ID最大一条产品,然后再查询每个用户所有产品,等每个用户ID最大一条产品显示完再显示的是全部产品,现在要改动的是红色部分,就是把查询每个用户ID最大一条产品改为查询每个用户更新时间最新的一条产品,但是更新的时间一键更新的话,时间是相同的,没法用max(),楼上各位我有些明白,但是该怎么替代到下面这个语句里呢?因为像SMT_data这样的字段是在SMT_yp标和SMT_cp表里有重名的

sql="select SMT_cp.SMT_id as cpid,SMT_cp.SMT_sortid,SMT_cp.SMT_cpjm,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpjgdw,SMT_cp.SMT_cpname,SMT_cp.SMT_cpjl,SMT_cp.SMT_yp_id,SMT_cp.SMT_pic,SMT_yp.paixu,SMT_yp.SMT_id,SMT_yp.SMT_user,SMT_yp.SMT_coname,SMT_yp.SMT_qyqq,SMT_yp.SMT_addtwo_id,SMT_yp.SMT_co,SMT_yp.SMT_vip,SMT_cp.SMT_date,0 as px from SMT_cp,SMT_yp where SMT_cp.SMT_id in (select max(SMT_cp.SMT_id) from SMT_cp Where 1=1 group by SMT_cp.SMT_yp_id )"&cjsort&" "&addsort&"and SMT_cp.SMT_yp_id=SMT_yp.SMT_id and (SMT_yp.SMT_vip<=5) and SMT_yp.SMT_key=1 union all select SMT_cp.SMT_id as cpid,SMT_cp.SMT_sortid,SMT_cp.SMT_cpjm,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpjgdw,SMT_cp.SMT_cpname,SMT_cp.SMT_cpjl,SMT_cp.SMT_yp_id,SMT_cp.SMT_pic,SMT_yp.paixu,SMT_yp.SMT_id,SMT_yp.SMT_user,SMT_yp.SMT_coname,SMT_yp.SMT_qyqq,SMT_yp.SMT_addtwo_id,SMT_yp.SMT_co,SMT_yp.SMT_vip,SMT_cp.SMT_date,1 as px from SMT_cp,SMT_yp where SMT_cp.SMT_yp_id=SMT_yp.SMT_id and SMT_yp.SMT_key=1 order by px,SMT_yp.paixu,SMT_cp.SMT_date DESC"
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

楼上各位高手,非常感谢,本人看不懂的是 [SMT_data]=t.[SMT_data] [dyid]=t.[dyid] 前一个SMT_data跟后一个t.[SMT_data] 不是同一个字段,怎么比
[/Quote]
外层查询跟where里的子查询做比较,每个相等的dyid下,取SMT_data最大的一个或者SMT_data相等的情况下取SMT_id最大的一个
--这个解释应该可以看懂了
  • 打赏
  • 举报
回复

--F姐姐写的就是对的
select
*
from
tb t
where
not exists(select 1 from tb where dyid=t.dyid
and (SMT_data>t.SMT_data or (SMT_data=t.SMT_data and SMT_id>t.SMT_id)))
加载更多回复(17)

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧