SQL-запрос для получения результатов поиска - PullRequest
0 голосов
/ 29 мая 2009

Мне нужна помощь в разработке запроса, который будет использоваться для получения результатов поиска на сайте. Пользователи ищут, выбирая элементы из списка атрибутов. Каждый возвращаемый элемент результатов поиска должен иметь ВСЕ атрибуты, выбранные пользователем.

Задача (по крайней мере для меня!) Состоит в том, чтобы выяснить, как вернуть результаты, которые имеют ВСЕ атрибуты, а не ЛЮБОЙ из них.

Элементы результатов поиска (назовем их WIDGET) находятся в таблице WIDGET. Возможные атрибуты виджета находятся в таблице ATTRIBUTE. В таблице соединений (WIDGETATTRIBUTEJUNCTION) хранится 0,1..n фактических атрибутов для каждого WIDGET.

Я не могу понять запрос, который при предоставлении списка атрибутов виджета будет возвращать строки, которые имеют каждый из этих атрибутов. Я подозреваю, что могу использовать подзапрос ALL и / или INTERSECT, но не знаю, как.

Ответы [ 3 ]

1 голос
/ 29 мая 2009

Вы можете использовать что-то похожее на следующее,

SELECT WidgetID FROM Widget INNER JOIN WidgetAttributes WA ON WA.Key = SearchAttributes.Key AND WA.WidgetID = Widget.WidgetID GROUP BY WidgetID HAVING COUNT(Widget.WidgetID) > @SearchAttributesCount

Ключом является оператор GROUP BY HAVING, который ограничивает его только включением всех строк виджетов, соответствующих всем атрибутам.

0 голосов
/ 29 мая 2009

У нас недавно была такая проблема:

select WidgetName,AttributeName 
 from Widgets
 left join WALinks    on WALinks.wid = WidgetID
 left join Attributes on WALinks.aid = AttributeID

where WidgetID in 
 (
  select wId 
  from waLinks 
  where aid in (1,3) 
  group by wId 
  having count(aId) = 2
 ) 

Затем вы можете установить атрибуты в списке «в (1,3)» и всегда корректировать число для запроса подсчета в соответствии с количеством атрибутов, которые вы соответствуете.

0 голосов
/ 29 мая 2009

Если только массивы, поддерживаемые SQL ...

Есть несколько способов сделать это, мой предпочтительный метод - отправить строку (содержащую идентификаторы атрибутов) в SQL, а затем разбить строку на таблицу.

Что-то вроде:

create function dbo.fn_makeArray ( @value nvarchar(max) )
    returns @table table([key] nvarchar(256))
    begin
        declare @start int;
        declare @end int;

        select @start = 1, @end = charindex(',', @value);

        while (@start < len(@value) + 1)
        begin
            if (@end = 0)
                set @end = len(@value) + 1;

            insert into @table ([key]) 
            values(substring(@value, @start, @end - @start));

            set @start = @end + 1;
            set @end = charindex(',', @value, @start);
        end
        return;
    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...