0

我有两个表:Sentence 和 WordIndex。

句子:
id、
text、
wordId

WordIndex:
id、
word、
sentenceId

设想:

示例:
语句表
1,“我跳过狗”,[1,2,3,4,5]
2,“我绊倒猫”,[6,7,8,9,10]

WordIndex 表
1, "i", 1
2, "jumped", 1
3, "over", 1
4, "the", 1
5, "dog", 1
6, "i", 2
7, "tripped", 2
8,“过”,2
9,“该”,2
10,“猫”,2

我想找到所有仅包含以下任何单词的句子:“i”、“jumped”、“over”、“the”、“dog”、“cat”。
如果我只是在索引中搜索这些词,将返回句子#2,它不应该包含在内。
我的想法是在 WordIndex 中找到与目标词不匹配的行。该结果包含我不想要的所有 SentenceId,而我不想要的所有 SentenceId。然后,获取不在该结果中的句子的 ID。

问题是,我对 MySQL 很陌生,有两个问题。
1)这似乎是获得预期结果的最有效方法吗?我需要它来很好地扩展(数百万个索引和数千个目标/允许的单词)。
2) 我如何将该解决方案转换为 SQL 语句?

4

1 回答 1

0

我要回答我自己的问题。以下查询(使用 Doctrine Query Language)将从给定的单词数组中检索仅包含单词的句子。

$search = "w.text != 'WORD' AND w.text != 'WORD'...";
$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery("
    SELECT s FROM BundleName:Sentence s 
    WHERE s.id NOT IN 
    (SELECT t.id FROM BundleName:Sentence t 
    JOIN t.words w WHERE ".$search.")
");

我不确定这是否有效,但它似乎有效。

于 2012-05-01T03:19:07.170 回答