【发布时间】:2016-06-01 02:28:24
【问题描述】:
我有两个表:DOCUMENT 和 METADATA。 DOCUMENT 存储一个 ID 和一些我们不感兴趣的信息,METADATA 存储这些文档的“标签”。标签由键和值组成。
所以对于一个文档,DOCUMENT 表中只有一个条目,但 METADATA 表中可能有很多。
现在我需要传递一组键/值,并从 METADATA 表中仅检索与所有键/值匹配的文档。这意味着“同时”检查不同的行,好吧,我真的不知道该怎么做。
快速示例:
META_KEY | META_VALUE | META_DOCUMENT_ID
----------------------------------------
Firstname| Chris | 1
Lastname | Doe | 1
Firstname| Chris | 2
Lastname | Moe | 2
因此,如果我使用以下标签进行查询:“Firstname”="Chris"、“Lastname”="Doe",我想要 1 作为结果。如果我只指定 "Firstname"="Chris" 我想要 1 和 2 作为结果。
非常感谢您的帮助!
编辑:
我计算必须匹配的标签数量怎么样? 像这样:
select meta_document_id, count(*) from metadata where (meta_key = 'Firstname' and meta_value = 'Chris') or (meta_key = 'Lastname' and meta_value = 'Doe') group by meta_document_id
通过 count(*),我可以轻松找出所有输入键/值对是否都匹配。这将如何在性能方面运行?
【问题讨论】:
-
为什么不能使用 select META_DOCUMENT_ID from table where META_VALUE=lastname
-
@safinhacko 可能是因为他想获取的不是所有具有
lastname的id,而是lastname== smth 的id -
这在更大范围内看起来很糟糕,我可能需要检索具有 10-20 个元数据键/值的文档...
-
“如果我用...查询”是什么意思?您将如何将标签传递给查询?看来您需要使用纯 SQL 以外的东西基于您的标签构建动态查询。
-
我将在 Java 中使用休眠。但事实上,我什至不知道如何传递论点。我想一个循环是不可避免的,但我需要查询是可靠的,有很多参数和/或表中有很多数据。