我有一张这样的表:
218 4 AudioVerse https://www.audioverse.org/english/podcasts/latest Latest NULL 2012-03-29 15:32:44.287
222 7 TPB http://rss.thepiratebay.se/0 Alt NULL 2012-03-31 17:55:49.223
223 7 EZTV http://www.ezrss.it/feed/ Alt NULL 2012-03-31 17:56:41.573
226 11 The Piratebay http://rss.thepiratebay.se/100 Audio Only NULL 2012-04-04 14:57:45.377
227 11 The Piratebay http://rss.thepiratebay.se/200 Video Only NULL 2012-04-04 14:58:04.650
229 15 ThePirateBay http://rss.thepiratebay.se/200 NULL 2012-04-06 22:40:12.730
230 14 The Pirate Bay http://rss.thepiratebay.se/0 NULL 2012-04-08 00:59:13.217
232 14 AudioVerse https://www.audioverse.org/english/podcasts/latest NULL 2012-04-08 01:03:22.787
233 14 EZTV http://www.ezrss.it/feed/ NULL 2012-04-08 01:20:55.860
234 17 Twit http://twit.tv/node/feed NULL 2012-04-13 18:59:23.037
235 17 Diggnation http://revision3.com/diggnation/feed/MP4-Large Video Large NULL 2012-04-13 19:01:52.817
我想要一个查询或存储过程来返回一个返回distinct的表,AND一个列有一个共同具有此url的id的列(第二个id列(4,7,11,15,14,17)是有问题的id)以逗号分隔的形式,如下所示:
http://rss.thepiratebay.se/0 3 4,5,7,7,11,11,15,14,14,14,17,17
http://rss.thepiratebay.se/200 2 4,5,7,7,11,11,15,14,14,14,17,17
http://www.ezrss.it/feed/ 2 4,5,7,7,11,11,15,14,14,14,17,17
https://www.audioverse.org/english/podcasts/latest 2 4,5,7,7,11,11,15,14,14,14,17,17
http://revision3.com/diggnation/feed/MP4-Large 1 4,5,7,7,11,11,15,14,14,14,17,17
http://twit.tv/node/feed 1 4,5,7,7,11,11,15,14,14,14,17,17
http://rss.thepiratebay.se/100 1 4,5,7,7,11,11,15,14,14,14,17,17
这里第一列是不同的url,下一个是url存在的次数(与上面的主表不同,但是你得到了点),以及逗号分隔的字符串,这些字符串是这些url所具有的共同的。
在这种情况下,以逗号分隔的字符串不正确。
我用来创建此表的查询是:
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' ,'') + cast(userid as varchar)
FROM sites
select url, COUNT(*), (@listStr)
from sites
group by url
order by COUNT(*) desc
我使用的是SQL Server 2008 R2。
我向您呈现的问题是:如何做到这一点,以及哪种方式(如果有多个方式)效率最高?
任何帮助将不胜感激。我可以在C#代码中执行此操作,但我更倾向于在存储过程或查询中使用它,这是最简单的和/或更快的:P
答案 0 :(得分:1)
我使用coalesce方法。我发现生成的连接字符串取决于在使用COALESCE之前是否使用值声明了字符串。以下脚本演示了这一点:
DECLARE @Mystring nvarchar( 500 ); --declare but do not set inital value
CREATE TABLE dbo.mytable( id int IDENTITY(1 , 1) PRIMARY KEY , name nvarchar( 40 ));
INSERT INTO mytable( name )
VALUES( 'Peter' ) , ( 'Paul' ) ,( 'Mary' );
SELECT @Mystring = COALESCE( @Mystring + ',' , '' ) + name
FROM dbo.mytable
ORDER BY id;
PRINT @Mystring; -- will print 'Peter,Paul,Mary' with no leading comma
SET @Mystring = ''; --now set to initial empty string
SELECT @Mystring = COALESCE( @Mystring + ',' , '' ) + name
FROM dbo.mytable
ORDER BY id;
PRINT @Mystring; --will print ',Peter,Paul,Mary' ie with leading comma
我不知道为什么tsql这样做(我使用的是2008 R2 Express),但值得注意。我现在将字符串变量初始化为空字符串,并使用SUBSTRING()函数删除前导分隔符以确保一致的行为。
我对tsql很陌生,如果这是旧帽子,我很抱歉,但我没有在其他地方找到它。
答案 1 :(得分:0)
试试这个:
select url, count(*), group_concat(userid)
from sites
group by url
order by COUNT(*) desc
答案 2 :(得分:0)
@BjørnØyvindHalvorsen
这个问题与OLD有关,但偶然发现并想到了解决它的问题。
---创建表
create table test_kin(id int,location varchar(max),url varchar(max)) 去
---插入一些值
插入test_kin值(4,'AudioVerse','https://www.audioverse.org/english/podcasts/latest')
插入test_kin值(7,'TPB','http://rss.thepiratebay.se/0')
插入test_kin值(7,'EZTV','http://www.ezrss.it/feed/')
插入test_kin值(11,'The Piratebay','http://rss.thepiratebay.se/100')
插入test_kin值(11,'The Piratebay','http://rss.thepiratebay.se/200')
插入test_kin值(15,'ThePirateBay','http://rss.thepiratebay.se/200')
插入test_kin值(14,'The Pirate Bay','http://rss.thepiratebay.se/0')
插入test_kin值(14,'AudioVerse','https://www.audioverse.org/english/podcasts/latest')
插入test_kin值(14,'EZTV','http://www.ezrss.it/feed/')
插入test_kin值(17,'Twit','http://twit.tv/node/feed')
插入test_kin值(17,'Diggnation','http://revision3.com/diggnation/feed/MP4-Large')
---查询以产生结果
select distinct url
,count(*) as ID
,stuff((
select ',' + cast([id] as varchar(max))
from test_kin
for xml path('')
), 1, 1, '') as Result
来自test_kin 按网址分组 按ID排序
HTH, 健