使用一个查询获取项目和所有相关标签

时间:2010-10-25 12:33:14

标签: sql-server subsonic

我有以下表格结构:

项目:

Id,         
Description 

标签:

Id,
TagName

ItemXrefTag

 Id,
 TagId,
 ItemId

阅读与某些标签相关的所有项目以及与项目相关的所有其他标签的最佳方式是什么,以便能够显示项目列表以及与该项目相关的所有标签?

如果不清楚我会举例:

项目,标签:

 Code complete, book|programming|cool
 Reactoring, book|programming|refactoring|cool
 C# for dummies, book|dont like it| not cool

P.S。我正在使用亚音速,但因为它支持从查询中获取数据我可以通过查询来获取所有数据。当然,我可以执行连接并迭代多行。我得到并使用每个标签的集合收集项目。我只对最有效的方法感兴趣。

2 个答案:

答案 0 :(得分:1)

您正在搜索GROUP_CONCAT功能。刚刚使用

在我的数据库上试过它
SELECT o.orderno,
       GROUP_CONCAT(d.itemno ORDER BY d.itemno ASC SEPARATOR ', ') as items
FROM order o
LEFT JOIN order_detail d ON o.id = d.order_id
GROUP BY d.order_id
ORDER BY o.id ASC

使用逗号分隔的有序商品列表返回订单号的结果:

orderno   | items
----------------------------------
201010001 | 100123, 100456, 100987
201010002 | 123456, 123457

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

但是我想这不是ANSI SQL所以它不适用于SQL-Server ;-),但是在stackoverflow的快速搜索返回了这个问题:Simulating group_concat MySQL function in Microsoft SQL Server 2005?

sql server中的相应命令应为CROSS APPLY

关于CROSS APPLY的另一篇好文章

http://www.sqlteam.com/article/using-cross-apply-in-sql-server-2005

对于亚音速的使用,你应该使用InlineQuery(又名CodingHorror)来执行带有亚音速的原始sql。

答案 1 :(得分:0)

这是加入所有数据的示例。除非你指定一个你想要的格式,这是我能做的最好的。

declare @item table (IID int identity(1,1), Description varchar(max))
declare @tags table (TID int identity(1,1), TagName varchar(50))
declare @ItemXrefTag table (XID int identity(1,1), TID int, IID int)


insert into @item values ('Book A')
insert into @item values ('Book B')


insert into @tags values ('Awesome!')
insert into @tags values ('Suckage!')
insert into @tags values ('Mediocre')


insert into @ItemXrefTag values (1,1)
insert into @ItemXrefTag values (3,1)
insert into @ItemXrefTag values (2,2)








select *
from @ItemXrefTag a
    left outer join @tags b
        on a.TID=b.TID
    left outer join @item c
        on a.IID=c.IID