2009-05-29 69 views
0

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

挑战(对我来说至少是!)是搞清楚如何只返回具有所有属性的结果而不是其中的任何一个。

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

我找不到一个查询,当提供一个控件属性列表时,它将返回具有这些属性中每一个属性的行。我怀疑我可能会使用ALL子查询和/或INTERSECT,但不知道如何。

回答

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具有其限制为只纳入符合所有的属性,所有的Widget行语句。

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

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