日期:2014-05-18  浏览次数:20471 次

再次求高手帮忙,这个SQL语句怎么写,万分感谢
这个问题困扰了很久,上次提问可能我没描述清楚,没有得到正确的答案,今天详细描述,希望哪位热心大侠能耐心看完描述,如能解决,万分感激,拜谢!

 数据库里有两个表 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 ) 请问各位大侠该怎么修改


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

在线等待您的回复!

------解决方案--------------------
SQL code
select * from
(
select [color=#FF0000]top 1[/color] 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 
[color=#FF0000]order by SMT_date desc, SMT_id desc[/color])
union all
....

------解决方案--------------------
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 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

------解决方案--------------------
探讨

引用:
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 ……

------解决方案--------------------
SQL code

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