2013-12-23 2 views
2

나는 다음과 같은 상황이 :최적화 SQL-를 쿼리 가입

표 단어 :

| 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) >>에 해당하는 워드 표를 사용하십시오.

그래서 결과는 내가 다음과 같은 SQL-코드를 내놓았다 무엇

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

해야한다 :

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

: 나는 이것에 대한 sqlfiddle했다
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 

코드가 기본적으로 작동하지만, 만약 당신이 프로가 있는지 물어보고 싶습니다. y는 파생 테이블없이 또는 실행 계획에서 filesort없이.

답변

3

단어 당 하나의 항목으로 테이블을 만들어야 테이블에 합류하여 문장을 만들 수 있습니다. 그것은 그들은 방법으로 당신이, 당신은 기본적으로 1 테이블 필드에 데이터의 여러 지점을두고, 데이터베이스를 활용하지 않는 설정이이

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

처럼 보일 것입니다.

위치 필드 ("주문"이라고하는 것이 유혹적이지만 SQL 키워드이므로 실행하지 마십시오. 자신을 미워할 것입니다)를 사용하여 문장을 '정렬'할 수 있습니다. 내가 실제로 편집 할 수 없기 때문에

(당신이 문장하기 sentense의 이름을 변경 할 수 있습니다?)

+0

안녕하세요, 내가 정규화 윈 테이블의 제안 된 솔루션을 주셔서 감사합니다, 내 문제의 문제는 정상화에 대해 단지 아니다 문제가 =에서 유래하는 현재 계획) 가장 큰 문제는 derrived table없이 가능하다면 ... – paschdan

+0

문제는 관계형 데이터베이스의 특정 기능을 찾고 있습니다. 하나 같이 사용하십시오. 이 경우 하나의 열에 여러 데이터 "항목"이 있으므로 데이터베이스가 훨씬 더 많은 작업을 수행 할 수 없습니다. 당신이 할 수있는 유일한 방법은 모든 단어를 검색하고, 문장을 검색하고, 코드로 대체하는 것입니다. 이제는 정규 표현식에 참여하지는 않지만 데이터가 어떤 방식인지, 이것이 가능한지, 그리고 아마도 정교함이 아닌지에 따라 달라집니다. 그래서 당신이 계획을 바꿀 수 없다면, 당신은 차선책으로 붙들려있다. ( – Nanne

+0

그래, 실제로 그게 어떻게 이루어지는 지, 나는 단지 문장 표를 얻고 코드를 검색하기 위해 foreach를하고있다. 그 이후의 실제 단어들, 그러나 그때는 다소 천천히 (문장의 수에 의존), 어쨌든 잘 고맙다;) – paschdan