0

我有几个界面元素存储在数据库表中,用户可以通过输入关键字进行过滤(存储在另一个表中):

表格按钮:

ID   Name
 1   Button1
 2   Button2
 3   Button3

表关键字:

ButtonID  Keyword 
       1  Garden
       2  House
       3  Garden
       3  House

如果用户输入Garden,则数据库返回Button1 and Button3

如果用户输入House,则数据库返回Button2 and Button3

如果用户输入Garden AND House,则 db 仅返回Button3

最后一个是问题,我设法把这个查询放在一起:

SELECT T.ID, T.Name
           , T.Type
           , T.Description
           , T.Action
           , T.Image 
FROM Tiles T 
JOIN Keywords K 
ON T.ID=K.TileID 
WHERE K.Keyword IN ('House', 'Garden')

不幸的是,此查询返回所有三个按钮以及任何提供的关键字。但我只想要所有提供的关键字的元素,即Button3. 查询应该是什么样子才能实现这一目标?

非常感谢 :)

4

3 回答 3

0

使用相交

SELECT T.ID, T.Name, T.Type, T.Description, T.Action, T.Image FROM Tiles T JOIN Keywords K ON T.ID=K.TileID WHERE K.Keyword like 'House'
intersect  
SELECT T.ID, T.Name, T.Type, T.Description, T.Action, T.Image FROM Tiles T JOIN Keywords K ON T.ID=K.TileID WHERE K.Keyword like 'Garden'

那应该可以得到你想要的。

于 2013-08-23T06:31:25.530 回答
0
SELECT name 
FROM tableButtons 
WHERE tableButtons.id = tableKeywords.id AND tableButtons.id 
IN 
(SELECT tableKeywords.id 
   FROM tableKeywords 
   WHERE id IN (<insert keywords here>))

您可能已经知道,上述语句中要执行的第一个查询将是子查询(内部选择),它将从用户输入中返回匹配关键字的所有 ID,然后这些 ID 将用于外部查询反过来将匹配两个表

于 2013-08-23T06:36:39.950 回答
0
declare @params table (Keyword varchar(6) primary key)

insert into @params
select 'House' union all
select 'Garden'

select
    b.Name
from Keywords as k
    inner join Buttons as b on b.ID = k.ButtonID
where k.Keyword in (select Keyword from @params)
group by b.Name
having count(*) = (select count(*) from @params)

sql fiddle demo

于 2013-08-23T06:39:05.400 回答