我有两张桌子
Object(NUMBER(22,0) id, VARCHAR(300) name)
Keywords(NUMBER(22,0) objectId, VARCHAR(20) keyword)
基本上当我输入一个新的Object
(通过Java程序)时,我会计算一些关键字并将它们放入Keywords
表中,通过它将它们链接到相对Object
。 Keywords.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" (但不是"响")。
我应该写什么类型的查询?
谢谢
答案 0 :(得分:2)
使用group by
和having
。假设没有重复:
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;