再次求高手帮忙,这个SQL语句怎么写,万分感谢

maoziheng 2012-07-05 04:47:48
这个问题困扰了很久,上次提问可能我没描述清楚,没有得到正确的答案,今天详细描述,希望哪位热心大侠能耐心看完描述,如能解决,万分感激,拜谢!

数据库里有两个表 SMT_yp(用户表) 和 SMT_cp(产品表)
其中 SMT_cp(产品表) 中的SMT_yp_id 字段对应SMT_yp(用户表)中的SMT_id字段

1、SMT_cp表里主要字段说明:SMT_id(自动编号字段) SMT_date(产品发布时间字段) SMT_yp_id(对应用户表的用户SMT_id字段) SMT_cpjg(产品价格字段)、SMT_cpname(产品名称字段)

2、SMT_yp表里主要字段说明:SMT_id(自动编号字段) SMT_date(用户注册时间字段) SMT_coname(用户名称字段)SMT_vip(用户等级字段)

3、这是我原来的SQL语句:查询结果是先查询出每个用户发布的产品中SMT_id最大的一条产品显示,然后再查询每个用户发布的所有产品显示,根据用户发布产品的时间、用户等级进行排序。

sql="select SMT_cp.SMT_id as cpid,SMT_cp.SMT_date,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpname,SMT_cp.SMT_yp_id,SMT_yp.SMT_id,SMT_yp.SMT_coname,SMT_yp.SMT_vip,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 )and SMT_cp.SMT_yp_id=SMT_yp.SMT_id
union all
select SMT_cp.SMT_id as cpid,SMT_cp.SMT_date,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpname,SMT_cp.SMT_yp_id,SMT_yp.SMT_id,SMT_yp.SMT_coname,SMT_yp.SMT_vip,1 as px from SMT_cp,SMT_yp where SMT_cp.SMT_yp_id=SMT_yp.SMT_id order by px,SMT_yp.paixu,SMT_cp.SMT_date DESC"


4、现在需要对这句SQL语句进行修改:想要得到的查询结果是先查询出每个用户产品发布时间SMT_date最新的一条产品,(因为用户在后台可对自己发布的全部产品进行一键更新全部产品时间,也可以更新单张产品的时间,这样有些用户一键更新后所有的产品发布时间都是相同的,有的选择单张更新的则会有时间先后顺序),
如果一些用户存在发布的所有产品时间全部相同情况,则提取他SMT_id最大的一张,接下来的就是显示每个用户发布的全部产品,根据用户发布产品的时间、用户等级进行排序。

需要修改的应该是这个部分: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 ) 请问各位大侠该怎么修改


希望能完整的看一下我的整个问题描述,帮帮忙,能够根据上面表的字段进行修改,万分感谢!

在线等待您的回复!
...全文
242 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
lycorisraya 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

引用 14 楼 的回复:
引用 13 楼 的回复:

引用 12 楼 的回复:
SQL code

--查询出每个用户产品发布时间SMT_date最新的一条产品,以SMT_id作为决胜属性
select sc.SMT_id as cpid,sc.SMT_date,sc.SMT_cpjg,sc.SMT_cpname,sc.SMT_yp_id,
sy.SMT_id,sy.SMT_c……
[/Quote]
对,sc1是SMT_cp的别名,别名名称可以任意命名,不过最好还是遵循命名规范!
tim_spac_126 2012-07-06
  • 打赏
  • 举报
回复

select
cp.SMT_id as cpid,
cp.SMT_date,
cp.cp.g,
cp.cp.ame,
cp.yp.id,
yp.SMT_id,
yp.SMT_coname,
yp.SMT_vip,
case when ls.SMT_yp_id is not null then 1 else 0 end as px
from SMT_cp cp
join SMT_yp yp on 1=1
and cp.SMT_yp_id=yp.SMT_id
left join (
select SMT_yp_id, max(SMT_id) as last_cp
from SMT_cp
group by SMT_yp_id
) as ls on 1=1
and ls.SMT_yp_id = yp.SMT_id
and last_cp = cp.SMT_id
order by px, cp.SMT_date, yp.SMT_vip

maoziheng 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
引用 13 楼 的回复:

引用 12 楼 的回复:
SQL code

--查询出每个用户产品发布时间SMT_date最新的一条产品,以SMT_id作为决胜属性
select sc.SMT_id as cpid,sc.SMT_date,sc.SMT_cpjg,sc.SMT_cpname,sc.SMT_yp_id,
sy.SMT_id,sy.SMT_coname,sy.SMT_vip……
[/Quote]

本人是菜鸟,还是没理解,那这句我该怎么写:
是写成
1、select top 1 SMT_cp1.SMT_id from SMT_cp sc1
where SMT_cp1.SMT_id=SMT_cp.SMT_id and SMT_cp1.SMT_yp_id=sy.SMT_id
order by SMT_cp1.SMT_date desc,SMT_cp1.SMT_id desc

还是
select top 1 SMT_cp.SMT_id from SMT_cp sc1
where SMT_cp.SMT_id=SMT_cp.SMT_id and SMT_cp.SMT_yp_id=sy.SMT_id
order by SMT_cp.SMT_date desc,SMT_cp.SMT_id desc

让你见笑了应该是哪个呢?sc1是不是就是个别名,我换成cp,wd随便什么名称都可以
lycorisraya 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 12 楼 的回复:
SQL code

--查询出每个用户产品发布时间SMT_date最新的一条产品,以SMT_id作为决胜属性
select sc.SMT_id as cpid,sc.SMT_date,sc.SMT_cpjg,sc.SMT_cpname,sc.SMT_yp_id,
sy.SMT_id,sy.SMT_coname,sy.SMT_vip,0 as px from ……
[/Quote]
sc1指的是子查询里的SMT_cp表,它和外部查询有关联
maoziheng 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
SQL code

--查询出每个用户产品发布时间SMT_date最新的一条产品,以SMT_id作为决胜属性
select sc.SMT_id as cpid,sc.SMT_date,sc.SMT_cpjg,sc.SMT_cpname,sc.SMT_yp_id,
sy.SMT_id,sy.SMT_coname,sy.SMT_vip,0 as px from SMT_cp sc,SMT_yp……
[/Quote]

你好,请问select top 1 sc1.SMT_id from SMT_cp sc1
where sc1.SMT_id=sc.SMT_id and sc1.SMT_yp_id=sy.SMT_id
order by sc1.SMT_date desc,sc1.SMT_id desc这里的SC1是指SMT_cp表还是指临时建立的表
shinger126 2012-07-06
  • 打赏
  • 举报
回复
select SMT_cp.SMT_id as cpid,SMT_cp.SMT_date,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpname,SMT_cp.SMT_yp_id,SMT_yp.SMT_id,SMT_yp.SMT_coname,SMT_yp.SMT_vip,0 as px from SMT_cp,SMT_yp where exists (select 1 from (select max(SMT_id) SMT_id,SMT_yp_id from
(select SMT_id,SMT_yp_id,max(SMT_date) SMT_date from SMT_cp group by SMT_id,SMT_yp_id) a group by SMT_yp_id) b where SMT_cp.SMT_id = b.SMT_id and SMT_cp.SMT_yp_id = b.SMT_yp_id )
and SMT_cp.SMT_yp_id=SMT_yp.SMT_id
tim_spac_126 2012-07-06
  • 打赏
  • 举报
回复

select
cp.SMT_id as cpid,
cp.SMT_date,
cp.SMT_cpjg,
cp.SMT_cpname,
cp.SMT_yp_id,
yp.SMT_id,
yp.SMT_coname,
yp.SMT_vip,
0 as px from SMT_cp,
case when ls.SMT_yp_id is not null then 0 else 1 end as px
from SMT_cp cp
join SMT_yp yp on 1=1
and cp.SMT_yp_id=yp.SMT_id
left join (
select SMT_yp_id, max(SMT_id) as last_cp
from SMT_cp
group by SMT_yp_id
) as ls on 1=1
and ls.SMT_yp_id = yp.SMT_id
and last_cp = cp.SMT_id
order by px, cp.SMT_date, yp.SMT_vip

tim_spac_126 2012-07-06
  • 打赏
  • 举报
回复

select
cp.SMT_id as cpid,
cp.SMT_date,
cp.SMT_cpjg,
cp.SMT_cpname,
cp.SMT_yp_id,
yp.SMT_id,
yp.SMT_coname,
yp.SMT_vip,
0 as px from SMT_cp,
case when ls.SMT_yp_id is not null then 0 else 1 end as px
from SMT_cp cp
join SMT_yp yp on 1=1
and cp.SMT_yp_id=yp.SMT_id
left join (
select SMT_yp_id, max(SMT_id) as last_cp
from SMT_cp
group by SMT_yp_id
) as ls on 1=1
and ls.SMT_yp_id = yp.SMT_id
and last_cp = cp.SMT_id
order by px, cp.SMT_date, yp.SMT_vip
shoppo0505 2012-07-06
  • 打赏
  • 举报
回复
楼主,你自己又不给出测试数据,贴了一段code。
大家都帮你整理了,你又说不对。

你自己贴的是union all,难保数据在两个集合中不重复。
你让别人怎么帮你。

而且我希望问问题的时候,只贴出关键代码。
你贴出的代码里面,90%都是无用的列,看起来累,写起来也累。
tim_spac_126 2012-07-06
  • 打赏
  • 举报
回复
16楼的代码试过么?
maoziheng 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
SQL code

--查询出每个用户产品发布时间SMT_date最新的一条产品,以SMT_id作为决胜属性
select sc.SMT_id as cpid,sc.SMT_date,sc.SMT_cpjg,sc.SMT_cpname,sc.SMT_yp_id,
sy.SMT_id,sy.SMT_coname,sy.SMT_vip,0 as px from SMT_cp sc,SMT_yp……
[/Quote]

试过了,不正确,结果中查询出来的有些用户有2三条显示出来
lycorisraya 2012-07-05
  • 打赏
  • 举报
回复
--查询出每个用户产品发布时间SMT_date最新的一条产品,以SMT_id作为决胜属性
select sc.SMT_id as cpid,sc.SMT_date,sc.SMT_cpjg,sc.SMT_cpname,sc.SMT_yp_id,
sy.SMT_id,sy.SMT_coname,sy.SMT_vip,0 as px from SMT_cp sc,SMT_yp sy
where sy.SMT_id=sc.SMT_yp_id
and sc.SMT_id=(
select top 1 sc1.SMT_id from SMT_cp sc1
where sc1.SMT_id=sc.SMT_id and sc1.SMT_yp_id=sy.SMT_id
order by sc1.SMT_date desc,sc1.SMT_id desc)
union all
/*
查询每个用户发布的所有产品显示,根据用户发布产品的时间、用户等级进行排序
因为在派生表里如果要排序的话,必须要指定top子句,所以top 2147483647可以确保结果集满足排序要求又可以查询出所有结果集
*/
select * from (select top 2147483647 SMT_cp.SMT_id as cpid,SMT_cp.SMT_date,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpname,SMT_cp.SMT_yp_id,
SMT_yp.SMT_id,SMT_yp.SMT_coname,SMT_yp.SMT_vip,1 as px
from SMT_cp,SMT_yp
where SMT_cp.SMT_yp_id=SMT_yp.SMT_id order by SMT_cp.SMT_date desc,SMT_yp.SMT_vip desc)as T
maoziheng 2012-07-05
  • 打赏
  • 举报
回复
高手们快出来吧,再顶顶
maoziheng 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
SQL code

select * from
(
select top 1 SMT_cp.SMT_id as cpid,SMT_cp.SMT_date,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpname,SMT_cp.SMT_yp_id,SMT_yp.SMT_id,SMT_yp.SMT_coname,SMT_yp.SMT_vi……
[/Quote]
不对的,不是我想要的结果
maoziheng 2012-07-05
  • 打赏
  • 举报
回复
试过结果出来不对,有其他答案吗
shoppo0505 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
最终还要根据用户等级等内容排序的,希望能看下我的详细描述,请先完整看下我的所有内容,知道的朋友请帮忙
[/Quote]

之后怎么排序随便你,现在的排序只是为了选取合适的数据
shoppo0505 2012-07-05
  • 打赏
  • 举报
回复
select * from
(
select top 1 SMT_cp.SMT_id as cpid,SMT_cp.SMT_date,SMT_cp.SMT_cpjg,SMT_cp.SMT_cpname,SMT_cp.SMT_yp_id,SMT_yp.SMT_id,SMT_yp.SMT_coname,SMT_yp.SMT_vip,0 as px from SMT_cp,SMT_yp where SMT_cp.SMT_id in (select max(SMT_cp.SMT_id) from SMT_cp
order by SMT_date desc, SMT_id desc)
union all
....
maoziheng 2012-07-05
  • 打赏
  • 举报
回复
最终还要根据用户等级等内容排序的,希望能看下我的详细描述,请先完整看下我的所有内容,知道的朋友请帮忙
maoziheng 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
引用 2 楼 shoppo0505 的回复:
用不着where 条件,你select top 1 就行,然后order by SMT_date, SMT_id

order by SMT_date desc, SMT_id desc
[/Quote]
感觉不对,因为我两个部分联合一起还要排序的。
maoziheng 2012-07-05
  • 打赏
  • 举报
回复
有谁能详细的写下整个语句,最近试来试去,试了很多,就是不对都搞混了,先谢谢,期待完整回答
加载更多回复(3)

22,210

社区成员

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

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