2012-12-10 53 views
0

我有AA表「單詞表」,用歸因於每個單詞的得分:1或-1:MySQL的:動態「IN」子句從上一個字符串的分割

id | name | val 
1, 'hello', 1, 
2, 'world', -1 
3, 'test', 1, 
... 

我也有一個表「文本」包含文本:

id | text | score 
1, 'hello world', 0 
2, 'Lorem Ipsum Dolor Sit Amet...', 0 
... 

我想更新字段「分數」從表「文本」這個規則:

得分=總和(wordlist.val),其中,每個字該句子出現在單詞列表中。

我試過這種方法,但它不工作:

update texts as t set score=(select sum(val) from wordlist where word in (concat('\'', replace(t.text,' ','\',\''),'\''))) 

我有超過50萬行數據的過程,所以我寧願只使用MySQL中,不使用任何PHP。

如果您有解決方案,請提前致謝!

我希望MySQL中有一個explode()函數!

回答

2

你可以使用FIND_IN_SET(),像這樣:

select 
    texts.*, sum(val) 
from 
    texts left join wordlist 
    on find_in_set(wordlist.name, replace(texts.`text`, ' ', ','))>0 
group by texts.id 

,如果你需要更新你的表,你可以這樣做:

update texts inner join (
    select texts.id, sum(val) as score 
    from texts left join wordlist 
     on find_in_set(wordlist.name, replace(texts.`text`, ' ', ','))>0 
    group by texts.id) s 
    on texts.id=s.id 
set texts.score=s.score 
+0

不錯,'find_in_set()'應該很快!雖然可能需要一個'group by'? – 2012-12-10 21:23:39

+0

@ebyrob是的,我忘了一羣,對不起:)'find_in_set'很好,但我不認爲它比'like' – fthiella

1

您可以使用RLIKE做一個正則表達式匹配單詞邊界,就像這樣:

UPDATE texts SET score = text_scores.score 
FROM (
    SELECT texts.id as text_id, SUM(wordlist.val) as score 
    FROM texts 
    JOIN wordlist 
    ON texts.text RLIKE CONCAT('[[:<:]]', wordlist.name, '[[:>:]]') 
    GROUP BY texts.id) text_scores 
WHERE id = text_scores.text_id 
+0

還可能與常規工作一樣:'ON CONCAT( ' 'texts.text,'')LIKE CONCA T('%',wordlist.name,'%')'。 – 2012-12-10 21:18:29