Goo*_*bot 3 mysql innodb mysql-5.5
我有一个系统可以为存储在列中的每个句子分配分数:
表 1:word_scores
word score
this 3
is 4
a 5
test 1
another 0
sentence 8
Run Code Online (Sandbox Code Playgroud)
表2:句子(得分列根据表1计算)
sentence score
this is a test 13
another sentence 8
this is 7
Run Code Online (Sandbox Code Playgroud)
现在我需要1.将每个句子提取到PHP中,2.然后将字符串拆分为单词,3.然后捕获每个单词的分数,4.然后计算word_scores的总和
是否可以在mysql中计算句子分数?
基本上是的,有一种方法可以做到这一点。
这是一个选择语句,它为您提供每个句子的分数
SELECT
PARSED_SENTENCES.sentence, SUM(COALESCE(WordScores.score, 0)) score
FROM (
SELECT sentence,
SUBSTRING(
sentence
FROM CASE
WHEN INDEX_TABLE.POS = 1 THEN 1
ELSE INDEX_TABLE.POS + 1
END
FOR CASE LOCATE(' ', sentence, INDEX_TABLE.POS + 1)
WHEN 0 THEN CHARACTER_LENGTH(sentence) + 1
ELSE LOCATE(' ', sentence, INDEX_TABLE.POS + 1)
END
- CASE
WHEN INDEX_TABLE.POS = 1 THEN 1
ELSE INDEX_TABLE.POS + 1
END
) AS word
FROM SentenceScores
INNER JOIN (
SELECT @rownum:=@rownum+1 POS
FROM (
SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) a, (
SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) b, (
SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) c, (SELECT @rownum:=0) r
) INDEX_TABLE
ON INDEX_TABLE.POS <= CHAR_LENGTH(SentenceScores.sentence)
AND (
INDEX_TABLE.POS = 1
OR SUBSTRING(SentenceScores.sentence FROM INDEX_TABLE.POS FOR 1) = ' '
)
) AS PARSED_SENTENCES
LEFT OUTER JOIN WordScores
ON PARSED_SENTENCES.word = WordScores.word
GROUP BY PARSED_SENTENCES.sentence;
Run Code Online (Sandbox Code Playgroud)
您应该能够将其转换为更新语句,以便您可以计算分数并将它们同时应用于表格。
根据下面的评论讨论,如果您想用静态数字表替换 numbers-table 子查询,您可以替换查询的这一部分:
INNER JOIN (
SELECT @rownum:=@rownum+1 POS
FROM (
SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) a, (
SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) b, (
SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) c, (SELECT @rownum:=0) r
) INDEX_TABLE
Run Code Online (Sandbox Code Playgroud)
只需:
INNER JOIN INDEX_TABLE
Run Code Online (Sandbox Code Playgroud)
假设您的数字表和数字列与子查询中的名称相同,即 INDEX_TABLE 和 POS
| 归档时间: |
|
| 查看次数: |
2544 次 |
| 最近记录: |