2011-04-14 49 views
1
Name  Hobby 
John | Fishing,Traveling 
Mary | Reading, 
Tom  | Music, 
Kate | Cooking,Reading 
George | Traveling, 
Peter | Fishing, 
Lisa | Cooking, 

我想選擇這個表MySQL的 - 如何查詢,可能有多個條目中的每個細胞,並在每個單元

Hobby  Count 
Fishing | 2 
Traveling | 2 
Reading | 2 
Music  | 1 
Cooking | 2 

我怎樣才能做到這一點得到的結果與單一值的表?

+0

發現將近一式二份,從Quassnoi HTTP一個有趣的答案://計算器。 com/questions/951357/mysql-group-with-a-comma-separated-field - 但是我100%同意其他人對模式進行規範化 – 2011-04-14 20:55:12

回答

1

我會不喜歡它@Wes

,或者如果它不是可能的話我會做它在PHP

$result = array(); 
$sql = 'SELECT Hobby, count(*) as cnt FROM youttable GROUP BY Hobby'; 
foreach ($conn->query($sql) as $row) { 
    foreach(explode(',',$row['Hobby']) as $hobby) { 
     $result[$hobby] += $row['cnt']; 
    } 
} 
-1
SELECT Hobby, Count(*) FROM myTable ORDER BY Hobby GROUP BY Hobby 
+0

這不適用於原始問題中提供的表結構。 – 2011-04-14 19:29:24

+0

這不適用於目前的數據形式。如果數據是正確的,那麼你的查詢將是正確的。他的問題是將多個值存儲在單個列中。 – Wes 2011-04-14 19:29:24

+0

我在原始帖子被重新格式化之前發佈了這個帖子,很明顯每個人都可以擁有多個Hobby。這張桌子的設計非常糟糕 - 應該規範化。 – AndrewR 2011-04-14 19:30:19

2

正確使用您的表格,而不是將多個興趣值填入單個列。你應該有:

John | Fishing 
John | Traveling 
Mary | Reading 
Tom  | Music 
Kate | Cooking 
Kate | Reading 
George | Traveling 
Peter | Fishing 
Lisa | Cooking 

然後,你可以這樣做:

select hobby 
    , count(*) count 
    from tablename 
group by hobby 
order by hobby 
+0

不幸的是我不能改變表格結構。有沒有辦法在我現有的表中進行查詢?感謝名單 – 2011-04-14 19:53:44

0

通常你會怎麼做是對的愛好單獨的表。 所以你的第一個表格將包含:nameID,name。 而你的第二個表格將包括:hobbyID,nameID,描述。 一旦你建立了它,你可以使用nameID將兩個表連接在一起。

SELECT * FROM nameTable, hobbyTable WHERE nameTable.nameID = hobbyTable.nameID 

而當你有這個,你可以使用count()在愛好表來獲得數量。

相關問題