2012-04-25 37 views
4

所以,我有兩個文本列在MySQL數據庫中,一個例子是如下:如何找到最常用的詞在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」中單詞出現次數的順序排列。

我希望這是有道理的。

回答

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 
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]) 
0

試試這個

SELECT sum(Score)/count(Name) as average FROM tablename where Name regexp "Mary"; 
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 
相關問題