选择与子匹配的行ID不匹配的行ID

时间:2012-04-30 15:36:01

标签: mysql

我有两个表:Sentence和WordIndex。

句:
ID,
文字,
的wordID

词汇索引:
ID,
一句话,
sentenceId

情景:

实施例
句子表
1,“我跳过了狗”,[1,2,3,4,5] 2,“我绊倒了猫”,[6,7,8,9,10]

WordIndex表
1,“我”,1
2,“跳”,1 3,“结束”,1
4,“the”,1
5,“狗”,1 6,“我”,2
7,“绊倒”,2
8,“结束”,2
9,“the”,2
10,“猫”,2

我想找到所有完全由以下任何一个词组成的句子:“i”,“jumped”,“over”,“the”,“dog”,“cat”。
如果我只是在索引中搜索这些单词,将返回第2句,不应包括在内 我的想法是找到WordIndex中与目标词不匹配的行。这个结果包括我不想要的所有SentenceId,而不是我所做的。然后,获取不在该结果中的句子的ids。

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

1 个答案:

答案 0 :(得分:0)

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

$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.")
");

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