2013-05-14 62 views
0

我有以下表結構:組行由字段

+------------------------+ 
| id | name | category | 
+------------------------+ 
| 1 | name_1 | cat_1 | 
| 2 | name_2 | cat_2 | 
| 3 | name_3 | cat_1 | 
| . | . |  . | 
| . | . |  . | 
| n | name_n | cat_k | 
+------------------------+ 

是「n」是表和「k」的總的行是任意數。我的問題是,有沒有辦法讓SQL查詢檢索按類別分組的行?我的意思是有可能得到像這樣的結構?

array(
    "cat_1" => array(
        "name_1", "1", 
        "name_3", "3", 
       ), 
    "cat_2" => array(
        "name_2", "2", 
         some rows .... 
       ), 
    ... 
    "cat_k" => array(
        some rows.... 
       ), 
) 

如果有什麼方法,請給我一些關鍵字,請不要整個解決方案。

回答

1

你不能在單個查詢中真正做到這一點,因爲單獨使用mysql將不能生成多維數組,但使用PHP幾乎是微不足道的。基本上,這裏是你會做什麼:

$cats = array(); 
while ($row = $result->fetch()) { 
    if (!isset($cats[$row->category])) { 
     $cats[$row->category] = array(); 
    } 
    $cats[$row->category][] = $row->name; 
} 
1

查詢本身不會給你的結構,但它是很容易讀懂的結果集到那種二維數組:

$query = "SELECT category, id, name FROM table ORDER BY category ASC, id ASC"; 


$result = /* use you DB query mechanism of choice here */; 

$array = array(); 

while($row = /* use your DB row fetch mechanism of choice here */) { 
    $array[$row['category']][] = array($row['id'] => $row['name']); 
} 
+0

什麼關於使用GROUP_CONCAT然後爆炸結果的每個元素?哪一個更有效? – papelucho

+0

@papelucho這將需要你在ID和名稱字段都做GROUP_CONCAT,所以你會有兩個字段爆炸和填充。另一方面,結果集中的行數將少於要遍歷的行數。我不能說哪一個在操作上更有效率(可以測試這個),但我可以說使用GROUP_CONCAT來做這件事非常非常規。如果您需要通過JOIN獲取數據(例如,可能是來自另一個表的類別描述字段),我所建議的方法也會更容易處理。 –