我有一张表(我们称之为已提交的表),其中包含(以及其他相关数据) text 字段,名为 para 其中包含用户提交的段落。
这些段落有时包含多字词短语,可能包含在另一个表格的字段中(我们称之为值表格),称为名称
两张桌子都很大。 已提交表格超过 400,000行 ,值表格超过 1,400,000行< / EM>
我想浏览所有段字段,如果任何段落中出现值表中的任何短语(可以是&gt; = 1个字),请链接值表中名称 ID的特定短语。
复杂的是,名称字段中的字数不固定,不同的名称字段值可以以相同的单词开头(例如Tom克兰西和汤姆克兰西的彩虹六是两个不同的条目)。 此外,该短语可以在任何地方和段字段中出现,而一个段可以匹配多个名称。
如果有一个段落:
我玩了很多游戏,到目前为止我最喜欢的游戏是Tom Clancy的Rainbow Six。
另一个问题是:
该系列中最好的是最初的汤姆克兰西和汤姆克兰西的彩虹六流氓矛。
如果值表格如下:
╔═════╦══════════════════════════════════════╗
║ ID ║ name ║
╠═════╬══════════════════════════════════════╣
║ 101 ║ Tom Harding ║
║ 102 ║ Tom Clancy's ║
║ 103 ║ Tom Clancy's Rainbow Six ║
║ 104 ║ Tom Clancy's Rainbow Six Rogue Spear ║
╚═════╩══════════════════════════════════════╝
然后我希望结果看起来像:
I've played many games and the best one I've liked so far is <a href="www.example.com/name/103">Tom Clancy's Rainbow Six</a>.
和
The best in the series are the original <a href="www.example.com/name/102">Tom Clancy's</a> and the <a href="www.example.com/name/104">Tom Clancy's Rainbow Six Rogue Spear</a>.
解决这个问题的最佳方法是什么?我不应该通过加入来做到这一点,对吧?
非常感谢您的投入!
答案 0 :(得分:0)
有一些疯狂的长查询,如果你的submitted
表有一个id,在我的例子中,我给它一个名为sid
的列
这是SQLFiddle
查询的作用是加入values
按sid,长度(名称)DESC排序,因为你想先替换最长的名字,但不是立即替换我用[103]或[替换它] 104](值中的名称id),因此一旦被替换,较短的名称(部分匹配)将找不到我们想要的另一个匹配。然后我用html链接替换这些[103],[104]值。
这是两次应用的相同方法。
该方法会沿途生成一些ID,以跟踪我们想要返回的行,该行始终是某个sid
的最后一行,因为此时所有匹配都已正确替换。