MySQL复杂查询|从词表中提取短语

MySQL复杂查询|从词表中提取短语,mysql,Mysql,我正在一个项目中使用python中的MySQL连接器,在这个项目中我正在分析书籍 我很乐意接受任何关于我的问题的帮助(解释如下) 相关数据库结构: 每本书中的每个单词都有自己的单词id(主键)和文本 每个单词实例都有单词id、单词序列、行内偏移量、句子编号等 实体Word\u实例的Word\u序列是它与本书开头的偏移量 每个短语都有自己的id和文本 每个短语和单词都有短语id和单词id(从上面) 现在,我正试图找出如何构建一个查询,从数据库中的用户那里找到短语 如果单词有连续的单词,并且在同一个

我正在一个项目中使用python中的MySQL连接器,在这个项目中我正在分析书籍

我很乐意接受任何关于我的问题的帮助(解释如下)

相关数据库结构:

每本书中的每个单词都有自己的单词id(主键)和文本

每个单词实例都有单词id、单词序列、行内偏移量、句子编号等

实体Word\u实例的Word\u序列是它与本书开头的偏移量

每个短语都有自己的id和文本

每个短语和单词都有短语id和单词id(从上面)

现在,我正试图找出如何构建一个查询,从数据库中的用户那里找到短语

如果单词有连续的单词,并且在同一个句子中,那么单词就是短语的一部分

到目前为止,我已成功构建了以下混乱的查询:

select book_id
     , word_txt
     , word_serial
     , sentence_serial
     , ROW_NUMBER() Over (partition by sentence_serial, book_id) as encounter_num
  from word
  join word_instance 
    on word.word_id = word_instance.word_id
  join word_in_phrase 
    on word.word_id = word_in_phrase.word_id
 where  phrase_id = %s 
 order 
    by book_id
     , sentence_serial
     , word_serial
下表中的图像是所述查询的结果集

假设用户输入了短语:“我相信原因”

在这种情况下,我需要提取单词_serial=562,因为它是所说短语的开头

我是否可以在不逐行提取并评估当前行是否是短语的一部分且顺序正确的情况下完成此任务

实际上,有很多方法可以检查SQL以外的情况,以考虑是否有可能。

我将非常感谢你的帮助,因为我在这个问题上停留太久了

根据要求,我正在上传相关数据库实体的图像:


这可能不是写这篇文章的最有效的方式,但我认为它在原则上是有效的,你可以根据自己的需要进行修补。请注意,我假设短语不能跨越句子边界(wi2.SENTURE\u serial=wi1.SENTURE\u serial),并且我假设存在一个从0开始并为每个单词增加1的列单词\u。我还假设word_id每行增加1。(您可以使用CTE,而不是实际的表格,使这些假设成为事实)

或者,您可能更喜欢以下内容

with (
 SELECT *
 FROM word_in_phrase
 WHERE phrase_id = %s
) as phrase
select wi1.book_id
     , word_txt
     , wi1.word_serial
     , wi1.sentence_serial
  from word
  join word_instance wi1
    on word.word_id = word_instance.word_id
  inner join word_instance wi2 
    on wi2.book_id = wi1.book_id and wi2.sentence_serial = wi1.sentence_serial
  INNER JOIN phrase 
    on wi2.word_id = phrase.word_id 
  WHERE wi2.word_id = wi1.word_id + phrase.order_id
  GROUP BY 
     wi1.book_id
     , word_txt
     , wi1.word_serial
     , wi1.sentence_serial
 HAVING COUNT(*) = (SELECT COUNT(*) FROM phrase)

完整的表格结构会很有用,但请特别注意,我认为您没有说哪个表格列定义了短语中单词的顺序。感谢您提供更多信息。那么你没有定义词组中单词顺序的列了吗?我们是否只假设单词表中的行的顺序就是顺序?短语是否可以跨句子(即,如果它们按单词顺序出现,但有不同的句子顺序)?@EdmCoff我很感激您的回答:)正如您正确假设的那样,我没有定义短语中单词顺序的列,但如果有必要,我将添加一列。因此,如果您设想存在这样一个列,您能生成一个结果集,返回这样一个短语开始的行吗?谢谢您还可以指定您的mysql版本吗?在mysql 8中查询可能会更简单,因为可以使用CTE/LEAD/LAG。非常感谢!我对你的答案做了一些调整,以适应我的数据库,效果非常好。您的回答提醒我需要更新SQL查询方面的知识。除了“接受”之外,我希望我能对你的回答投赞成票,但这个问题打击了我的声誉,也剥夺了我的赞成票特权。再次感谢你,伙计!
with (
 SELECT *
 FROM word_in_phrase
 WHERE phrase_id = %s
) as phrase
select wi1.book_id
     , word_txt
     , wi1.word_serial
     , wi1.sentence_serial
  from word
  join word_instance wi1
    on word.word_id = word_instance.word_id
  inner join word_instance wi2 
    on wi2.book_id = wi1.book_id and wi2.sentence_serial = wi1.sentence_serial
  INNER JOIN phrase 
    on wi2.word_id = phrase.word_id 
  WHERE wi2.word_id = wi1.word_id + phrase.order_id
  GROUP BY 
     wi1.book_id
     , word_txt
     , wi1.word_serial
     , wi1.sentence_serial
 HAVING COUNT(*) = (SELECT COUNT(*) FROM phrase)