Получить элемент и все связанные теги одним запросом - PullRequest
0 голосов
/ 25 октября 2010

У меня есть следующая структура таблиц:

Элемент:

Id,         
Description 

Теги:

Id,
TagName

ItemXrefTag

 Id,
 TagId,
 ItemId

Что такоелучший способ прочитать все элементы, относящиеся к какому-либо тегу, и все остальные теги, относящиеся к элементам, чтобы иметь возможность отображать список элементов и все теги, относящиеся к элементу?

Если неясно, я`приведу пример:

Item, Tags:

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

PS Я использую дозвуковой, но так как он поддерживает получение данных для запроса, я в порядке с запросом, который позволит мнеполучить все данные.Конечно, я могу выполнить объединение и перебрать несколько строк, которые я получу и соберу элементы с коллекцией тегов для каждой из них.Я просто заинтересован в наиболее эффективном способе реализации этого.

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Вы ищете функцию 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 вернул этот вопрос: Имитация функции MySQL group_concat в Microsoft SQL Server 2005?

Соответствующая команда на сервере sql должна быть CROSS APPLY

Еще одна хорошая статья о CROSS APPLY

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

Для использования с subsonic вы должны использовать InlineQuery (он же CodingHorror) для выполнения raw sql с subsonic.

0 голосов
/ 25 октября 2010

вот пример для объединения всех данных. если вы не укажете нужный формат, это лучшее, что я могу сделать.

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
...