如何根据必须包含的不同关键字查询表格

时间:2016-02-04 12:05:05

标签: sql oracle

我有两张桌子

  • Object(NUMBER(22,0) id, VARCHAR(300) name)
  • Keywords(NUMBER(22,0) objectId, VARCHAR(20) keyword)

基本上当我输入一个新的Object(通过Java程序)时,我会计算一些关键字并将它们放入Keywords表中,通过它将它们链接到相对ObjectKeywords.objectId字段。

现在我需要通过一些关键字查询我的Objects,并且每个关键字必须存在于项目中才能由查询返回。

一个例子:

Object table
---------------------------------
id          |   name            |
---------------------------------
0           |   hand            |
1           |   foot            |
---------------------------------

Keywords table
---------------------------------
objectId    |   keywords        |
---------------------------------
0           |   finger          |
0           |   ring            |
1           |   finger          |
---------------------------------

如果我搜索关键字"指环"它应该只返回我"手"而不是"脚"。

我尝试了查询

SELECT name FROM
Object JOIN Keywords ON Object.id=Keywords.objectId
WHERE
keywords='finger' AND keywords='ring'

但显然它没有给我任何回报,因为该字段"关键字"不能有价值"手指"和"响#34;同时。

即使是这个查询:

SELECT name FROM
Object JOIN Keywords ON Object.id=Keywords.objectId
WHERE
keywords='finger' OR keywords='ring'

是错误的,因为它返回了我的两个对象,因为"脚"对象的关键字为" finger" (但不是"响")。

我应该写什么类型的查询?

谢谢

1 个答案:

答案 0 :(得分:2)

使用group byhaving。假设没有重复:

SELECT o.name
FROM Object o JOIN
     Keywords k
     ON o.id = k.objectId
WHERE k.keywords IN ('finger', 'ring')
GROUP BY o.name
HAVING COUNT(*) = 2;