1

我有一个表格“wordlist”,每个单词都有一个分数:1或-1:

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

我想使用以下规则更新表“文本”中的“分数”字段:

score = sum(wordlist.val) 其中句子的每个单词都存在于单词列表中。

我试过这种方式,但它不起作用:

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

我有超过 500K 行数据要处理,所以我宁愿只使用 MySQL,而不使用任何 PHP。

如果您有解决方案,请提前致谢!

我希望 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 回答