用于检索搜索结果的SQL查询

时间:2009-05-29 10:07:32

标签: sql select

我需要帮助设计一个用于返回网站搜索结果的查询。用户通过从属性列表中选择项目进行搜索。返回的每个搜索结果项必须具有用户选择的所有属性。

挑战(至少对我来说!)正在弄清楚如何只返回具有所有属性的结果而不仅仅是任何属性。

搜索结果项(让我们称之为WIDGET)位于WIDGET表中。可能的窗口小部件属性位于ATTRIBUTE表中。联结表(WIDGETATTRIBUTEJUNCTION)存储每个WIDGET的0,1..n实际属性。

我无法弄清楚一个查询,当提供一个widget属性列表时,将返回具有这些属性中的每一个的行。我怀疑我可能会使用ALL子查询和/或INTERSECT但不确定如何。

3 个答案:

答案 0 :(得分:1)

您可以使用类似于以下内容的内容,

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语句,它将其限制为仅包含与所有属性匹配的所有Widget行。

答案 1 :(得分:0)

如果只支持SQL数组......

有几种方法可以解决这个问题,我首选的方法是将一个字符串(包含属性ID)发送给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

答案 2 :(得分:0)

我们之前遇到过这样的问题:

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
 ) 

然后,您可以将属性设置为“in(1,3)”中的列表,并始终将计数查询的数量调整为您要匹配的属性数。