簡體   English   中英

優化在JOIN中使用REGEXP的SQL查詢

[英]Optimize SQL-Query that is using REGEXP in a JOIN

我有以下情況:

表詞:

| 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>> |

我想用字表中的等效字替換<<(\\ d)>>。

所以結果應該是

| 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

我為此做了一個sqlfiddle:

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

該代碼基本上可以正常工作,但是我想問您專業人士,是否有一種在執行計划中沒有派生表或沒有文件排序的方法。

您應該制作一個表,每個單詞有一個條目,因此可以通過加入該表來制作您的句子(原文如此)。 看起來像這樣

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

他們以這種方式進行設置,而沒有利用數據庫,基本上是將多個數據點放在一個表字段中。

位置字段(很容易將其稱為“ order”,但是由於這是一個SQL關鍵字,請不要這樣做,您會討厭自己)可用於對句子進行“排序”。

(您可能想將SENSENSE重命名為句子?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM