我有一些存储在数据库表中的界面元素,用户可以通过输入关键字(存储在另一个表中)进行过滤:
表按钮:
ID Name
1 Button1
2 Button2
3 Button3
表关键字:
ButtonID Keyword
1 Garden
2 House
3 Garden
3 House
如果用户输入Garden
,则db返回Button1 and Button3
。
如果用户输入House
,则db返回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
的元素。
查询应该如何实现?
非常感谢:)
答案 0 :(得分:0)
使用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 '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'
那应该能得到你想要的东西。
答案 1 :(得分: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将是在外部查询中使用,而外部查询又匹配两个表
答案 2 :(得分: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)