0

我有一张这样的桌子:

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

我想要一个查询或存储过程返回一个返回不同的表,以及一个具有该 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 共有的 id 的逗号分隔字符串。

在这种情况下,逗号分隔的字符串不正确。

我用来创建此表的查询是:

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

4

3 回答 3

1

我使用合并方法。我发现生成的连接字符串取决于在使用 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 很陌生,所以如果这是旧帽子的东西,我很抱歉,但我没有发现它在其他地方被覆盖。

于 2012-05-22T09:37:15.330 回答
0

@BjørnØyvind Halvorsen

这个问题相对来说是旧的,但是遇到了它并想对此有所了解。

--- 创建表

创建表 test_kin (id int, location varchar(max), url varchar(max)) go

--- 插入一些值

插入 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,'海盗湾','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 group by url order by ID

HTH,健

于 2013-01-22T21:22:35.260 回答
0

尝试这个:

select url, count(*), group_concat(userid) 
from sites
group by url
order by COUNT(*) desc
于 2012-04-15T10:02:57.000 回答