2013-12-23 40 views
2

我有以下情況:優化的SQL查詢中使用REGEXP一個JOIN

表字:

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

TABLE語句:

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

,我想更換< <(\ d)>>與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 

我爲這個sqlfiddle:

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

該代碼基本上正在工作,但我想問問你的專業人員,如果有一個華y沒有派生表或執行計劃中沒有filesort。

回答

3

你應該製作一個表格,每個單詞一個入口,所以你的sentense(原文如此)可以通過加入該表格製作。這將是這個樣子

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

他們這樣,你有它設置了,你是不是把你的數據庫的優勢,在1臺場基本上將數個數據點。

位置字段(它很誘人稱爲「order」,但是因爲這是一個SQL關鍵字,所以不要這樣做,你會討厭自己的)可以用來對這個句子進行「排序」。

(你可能要重新命名sentense判?)

+0

你好,我很欣賞你提出了一個標準化的NN表的解決方案,在我的問題的問題,僅僅是不是正火,因爲我其實不能編輯目前的方案,其中的問題來自=) 主要問題是,如果這是可能的沒有一個derrived表... – paschdan

+0

問題是,你正在尋找關係數據庫的特定功能,你可以得到,如果你像一個一樣使用它。在這種情況下,在一列中有幾個數據「項目」,所以數據庫不能做更多的事情,然後掃描它們。你能做的唯一的事情就是檢索所有的單詞,檢索所有的句子,並用代碼替換它們。現在你沒有加入正則表達式,但它取決於你的數據是如何的,如果這是一種可行的方式,並且可能不是很精確。所以,如果你不能改變這個方案,你就會陷入次優解決方案:( – Nanne

+0

是啊,看起來像那樣,它是如何實際完成的,我只是得到句子表,並且正在做一個foreach的代碼來檢索之後的實際單詞,但此時有點緩慢(取決於句子的數量),好於反正;) – paschdan