【问题标题】:For each set of keywords in one table, find all matching hits in a second table对于一个表中的每组关键字,在第二个表中查找所有匹配的匹配项
【发布时间】:2019-01-19 11:05:08
【问题描述】:

免责声明:我正在使用带有 2 个表的 MySQL。到目前为止,当使用 IN() 一次查询一个组时,我已经找到了解决我的问题的方法,但没有任何方法可以让我在不循环多个查询的情况下一次完成整个表。

我有两张桌子:

CREATE TABLE WordGroups (
  wgId int NOT NULL AUTO_INCREMENT,
  groupId int NOT NULL,
  word varchar(255) NOT NULL,
  PRIMARY KEY (wgId)
);

跟踪关键字组、单词到 groupId 和

CREATE TABLE ArticleWords (
  awId int NOT NULL AUTO_INCREMENT,
  articleId int NOT NULL,
  word varchar(255) NOT NULL,
  PRIMARY KEY (awId)
);

跟踪文章中的关键词。

我正在尝试构建一个可以获取单词组的单个查询,并为每个组返回包含至少所有这些单词的所有文章。

我意识到如果我在单个查询中一次查找一个组,这非常简单,但是我似乎无法弄清楚如何在所有匹配子集的集合中生成单个查询结果。

例如假设两个表有以下数据:

词组

groupId   |  word
-----------------
1         |  B
1         |  A
2         |  C
2         |  E
3         |  F

ArticleWords

articleId |  word
-----------------
1         |  A
1         |  C
1         |  B
2         |  C
3         |  A
3         |  B
3         |  F
4         |  C
4         |  E
4         |  F

结果查询将返回:

groupId | articleId
1       | 1
1       | 3
2       | 4
3       | 3
3       | 4

因为这些文章至少包含来自这些组的所有单词。

我尝试使用内部连接将两个表相交,但匹配不完整的单词组导致行:

groupId | articleId
2       | 2

之所以出现在结果中,是因为第 2 条包含单词“C”。我对想法持开放态度,因为我涉足了不太严肃的 MySQL,但这整个星期都在逃避。

非常感谢任何帮助。我正想知道我是否正在尝试让 SQL 做一些它不应该做的事情。我有一个很长的查询,它适用于最多 6 个单词的 WordGroup,但它非常精确且不可扩展,此查询需要适用于任何大小的 WordGroup 才可行。

感谢您的阅读!

【问题讨论】:

    标签: mysql sql database performance search


    【解决方案1】:

    这是一种方法,使用group_concat()进行比较:

    select wg.groupId, aw.articleId
    from articlewords aw join
         wordgroups wg
         on wg.word = aw.word join
         (select wg.groupId, group_concat(wg.word order by word) as words
          from word_groups wg
          group by wg.groupId
         ) wgw
         on wgw.groupId = wg.groupid
    group by aw.articleid, wgw.words
    having group_concat(aw.word order by aw.word) = wgw.words;
    

    Here 是一个 SQL Fiddle。

    【讨论】:

    • 我尝试过这样的事情,我想加入两个按相同顺序排列的 group_concats 的结果(例如按字母顺序)。但是我似乎无法使语法正常工作。我尝试运行您的上述查询,但它也有语法错误:sqlfiddle.com/#!9/5592d1/4
    • 我也意识到,即使我可以比较两者,我也需要测试所有排列和排除,因为我不只是想要完全匹配,我想要至少所有单词都在的匹配那篇文章,这篇文章还可以有其他词。
    • @DevByTradeAndLove 。 . .修复了查询中的一些小问题。它有效。
    • @Gorgon Linoff 这成功了!这是我完全错过的。太棒了,谢谢你的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2021-09-13
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多