【问题标题】:Selecting row ids that don't match row ids of a sub match选择与子匹配的行 ID 不匹配的行 ID
【发布时间】:2012-05-01 11:19:07
【问题描述】:

我有两个表:Sentence 和 WordIndex。

句子:
身份证,
文字,
字号

词索引:
身份证,
词,
句号

场景:

示例:
句子表
1、《我跳过了狗》,[1,2,3,4,5]
2、《我绊倒了猫》,[6,7,8,9,10]

单词索引表
1,“我”,1
2、“跳”、1
3、“结束”、1
4、“之”、1
5、《狗》、1
6、“我”、2
7、“绊倒”、2
8、“结束”、2
9、“的”、2
10,“猫”,2

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

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

【问题讨论】:

  • 你应该看看full text search
  • 感谢您的想法。我通读了各种全文搜索选项。它看起来不像我的场景,因为我不是在寻找某些在行中存在或不存在的单词。我正在寻找只包含单词数组中的单词的行,但这些单词都不是特别需要的。
  • 对于高度相关的数据,考虑mongodb

标签: mysql


【解决方案1】:

我将回答我自己的问题。以下查询(使用 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.")
");

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

【讨论】:

    猜你喜欢
    • 2016-06-01
    • 2016-10-14
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多