4

所以我在 MySQL 数据库中有两列文本,示例如下:

Name             Score
Henry Hodgens    4
Mary Hodgens     8
Jim Servan       2
Jane Servan      4
Hank Servan      6
Sarah Smith      10
Mary Smith       12
Henry Dobbins    2
Henry Jenkins    4

我需要使用 PHP 运行一个查询,该查询可以根据“名称”中单个单词的最常见出现来显示“分数”的平均值。因此,它将显示“Servan”平均为 4,“Henry”平均为 3.3,“Hodgens”平均为 6,“Mary”平均为 10,按照“Name”中单词出现次数最多的顺序。

我希望这是有道理的。

4

4 回答 4

3

这在 MySQL 内部很难做到。它在存储和检索关系值方面非常出色,但在进行这种计算方面并不那么出色。如果您不介意在 PHP 中执行此操作,可以使用下面的代码来计算频率。

foreach ($rows as $row)
{
    foreach (explode(" ", $row['Name']) as $token)
    {
        $total[$token] += (int)$row['Score']; 
        $occurances[$token]++;
    }
}

// compute average by taking ($total[$token])/($occurances[$token])
于 2012-04-25T07:09:26.367 回答
1

你可以这样做:

SELECT
    AVG(t.Score) AS ScorceAvg,
    t.name
FROM
    (
        SELECT 
            SUBSTRING(Table1.Name,1,INSTR(Table1.Name, ' ')) AS name,
            Table1.Score
        FROM 
            Table1
        UNION ALL
        SELECT 
            SUBSTRING(Table1.Name,INSTR(Table1.Name, ' ')) AS name,
            Score
        FROM 
            Table1
    ) AS t
GROUP BY
    t.name
于 2012-04-25T07:30:58.837 回答
1

这是完美的东西

SELECT distinct
       SUBSTRING(NAME, LOCATE(' ',NAME)+1) as NameED,
      (select
       avg(score)
       from avgscore
       where NameED = SUBSTRING(NAME, LOCATE(' ',NAME)+1)) as Score
FROM avgscore
于 2012-04-25T09:02:14.313 回答
0

尝试这个

SELECT sum(Score)/count(Name) as average FROM tablename where Name regexp "Mary";
于 2012-04-25T07:17:54.477 回答