【问题标题】:SELECTing (almost) duplicate rows选择(几乎)重复的行
【发布时间】:2014-04-10 15:20:02
【问题描述】:

我的桌子看起来像这样:

| id (int) | sentence (varchar) |

我想查找除一个特定单词外几乎相同的所有行。例如:

| 230 | test |
| 321 | test sth |
...
| 329 | is (sth) it?
| 923 | is it?

在这种情况下,可以不同的词是sth。理想情况下,我可以对可能不同的单词列表使用某种“数组”。

这是我可以纯粹在 SQL 中做的事情吗?

【问题讨论】:

  • 全文搜索并按相关性排序?对于像这样的“模糊”字符串匹配,基本的 sql 完全是糟糕的。
  • 仅供参考:Stack Overflow Regular Expression FAQ 中有官方 MySQL regex documentaiton 的链接,列在“通用文档 > 特定风格的官方文档 > 数据库”下。
  • “除了一个特定的词外,相同”是指“特定的词可以出现或不存在”还是意味着“特定的词可能不同/拼写错误/替换为任何其他词,但句子的其余部分保持不变”?

标签: mysql regex mariadb


【解决方案1】:

只是一个未经测试的快速拍摄,抱歉,但我认为你可以做类似的事情

SELECT * FROM table GROUP BY REPLACE(text, 'sth', '')

【讨论】:

  • 当然,假设您想从 every 记录中删除 every 出现的'sth'。另外,您的选择列表可能应该超过id,例如GROUP_CONCAT(id).
  • 此查询不应修改任何内容。 “删除”是什么意思?
【解决方案2】:

您可以使用SOUNDEX。因此,对于您提供的 示例,这些查询:

SELECT SOUNDEX('test')
SELECT SOUNDEX('test sth')
SELECT SOUNDEX('is (sth) it?')
SELECT SOUNDEX('is it?')

返回这些结果:

T230
T230
I200
I200

这意味着前两个后两个 听起来很像。我无法确定这将如何与您的实际数据配合使用,您只需要尝试一下。

【讨论】:

  • 我得到 SOUNDEX('test sth') = 'T2323'SOUNDEX('is (sth) it?') = SOUNDEX ('is it?') = 'I230' :/
  • @eggyal,嗯,除了SOUNDEX('test') 得到T2323T230 之外,我不确定我能不能解释清楚?
  • 我收到SOUNDEX('test') = 'T230'。见sqlfiddle
猜你喜欢
  • 2020-03-21
  • 2011-06-01
  • 2017-03-24
  • 1970-01-01
  • 2013-03-19
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
相关资源
最近更新 更多