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