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

这句SQL语句该怎么写,请教高手!
数据库里有每个用户发布的产品,每个用户都可以发布多条产品。产品发布后用户在后台可一次更新一条产品的发布时间,也可以一键更新全部产品的发布时间,此时用户发布的产品全部时间都相同,如下表中的用户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
 

------解决方案--------------------
SQL code
--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO 
CREATE TABLE [tb]([SMT_id] INT,[dyid] INT,[SMT_data] DATETIME)
INSERT [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'
--------------开始查询--------------------------
--1
SELECT * FROM [tb] t WHERE NOT EXISTS(SELECT 1 FROM [tb] WHERE [SMT_data]=t.[SMT_data] AND [SMT_id]>t.[SMT_id])
AND NOT EXISTS(SELECT 1 FROM [tb] WHERE [dyid]=t.[dyid] AND [SMT_data]>t.[SMT_data])
--2
SELECT * FROM [tb] t WHERE [SMT_id]=(SELECT MAX([SMT_id]) FROM [tb] WHERE [SMT_data]=t.[SMT_data])
AND [SMT_data]=(SELECT MAX([SMT_data]) FROM [tb] WHERE [dyid]=t.[dyid])
----------------结果----------------------------

/* 
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

(3 行受影响)


*/

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

本人是菜鸟,看不懂这个意思:WHERE [SMT_data]=t.[SMT_data] 这是同一个标里的字段做比较?

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