1

テーブル「wordlist」があり、各単語にスコアが割り当てられています:1または-1のいずれか。

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

また、テキストを含むテーブル「texts」があります。

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

次のルールを使用して、テーブル「texts」のフィールド「score」を更新したいと思います。

スコア=sum(wordlist.val)ここで、文の各単語は単語リストに存在します。

私はこの方法を試しましたが、機能していません:

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

処理するデータが50万行を超えているため、PHPを使用せずにMySQLのみを使用したいと思います。

解決策があれば事前に感謝します!

MySQLにexplode()関数があればいいのにと思います!

4

2 に答える 2

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
于 2012-12-10T21:19:08.967 に答える
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
于 2012-12-10T21:06:46.850 に答える