优化在JOIN中使用REGEXP的SQL查询

时间:2013-12-23 09:35:58

标签: mysql sql regex

我有以下情况:

表格词:

| ID |   WORD |
|----|--------|
|  1 |     us |
|  2 |     to |
|  3 | belong |
|  4 |    are |
|  5 |   base |
|  6 |   your |
|  7 |    all |
|  8 |     is |
|  9 |  yours |

表句:

| ID |                                  SENTENCE |
|----|-------------------------------------------|
|  1 | <<7>> <<6>> <<5>> <<4>> <<3>> <<2>> <<1>> |
|  2 |                         <<7>> <<8>> <<9>> |

我想替换&lt;&lt;(\ d)&gt;&gt;使用Word-Table中的等效单词。

所以结果应该是

| ID |                       SENTENCE |
|----|--------------------------------|
|  1 | all your base are belong to us |
|  2 |                   all is yours |

我想出的是以下SQL代码:

SELECT id, GROUP_CONCAT(word ORDER BY pos SEPARATOR ' ') AS sentence FROM (
    SELECT sentence.id, words.word, LOCATE(words.id, sentence.sentence) AS pos
    FROM sentence
    LEFT JOIN words
    ON (sentence.sentence REGEXP CONCAT('<<',words.id,'>>'))
    ) AS TEMP
GROUP BY id

我为此做了一个方便的小说:

http://sqlfiddle.com/#!2/634b8/4

代码基本上是可行的,但是我想问一下专业人员,如果在执行计划中没有派生表或没有filesort的方法。

1 个答案:

答案 0 :(得分:3)

你应该制作一个每个单词有一个条目的表格,所以你可以通过加入那个表格来表达你的意思(原文如此)。它看起来像这样

SentenceId, wordId, location
2,          7,       1
2,          8,       2
2,          9,       3

他们设置的方式,你没有利用你的数据库,基本上把几个数据点放在1个表字段中。

位置字段(很容易将其称为“顺序”,但由于这是一个SQL关键字,不要这样做,你会讨厌自己)可以用来“排序”句子。

(您可能想将Sentense重命名为句子?)