Mysql 优化在联接中使用REGEXP的SQL查询

Mysql 优化在联接中使用REGEXP的SQL查询,mysql,sql,regex,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 | |-

我有以下情况:

表格文字:

| 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>> |
我想到的是以下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
我为此做了一把小提琴:


代码基本上正常工作,但我想问一下,在执行计划中是否有一种方法没有派生表或没有文件排序。

您应该创建一个每个单词有一个条目的表,这样您的sentense sic就可以通过加入该表来生成。它看起来像这样

SentenceId, wordId, location
2,          7,       1
2,          8,       2
2,          9,       3
按照您设置的方式,您并没有利用数据库,基本上是将多个数据点放在一个表字段中

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


您可能想将sentense重命名为句子?

您好,我很欣赏您提出的规范化n-n表的解决方案,我的问题不在于规范化,因为我实际上无法编辑问题来源的当前方案=主要问题是,如果这在没有数据驱动表的情况下是可能的,那么问题是您正在从关系数据库中寻找特定的功能,如果您像使用关系数据库一样使用它,您可以得到这些功能。在这种情况下,您的数据库在一列中有多个数据项,因此数据库只能扫描这些数据项。您唯一能做的就是检索所有单词,检索所有句子,并在代码中替换它们。现在您没有加入regexp,但这取决于您的数据是如何的,如果这是一种可行的方法,并且可能没有太多的改进。因此,如果你不能改变方案,你就会陷入次优解决方案:是的,看起来是这样,实际上就是这样做的,我只是得到了句子表,然后在代码中做了一个foreach来检索实际单词,但目前这有点慢,取决于句子的数量,无论如何都比x慢;
SentenceId, wordId, location
2,          7,       1
2,          8,       2
2,          9,       3