2014-06-16 52 views
0

不確定標題是否真正定義了我正在尋找的內容。mysql - 返回第一列一次,並返回所有相應的列數據

我想要做的是返回具有匹配列值的所有行。僅顯示第一個值一次,並顯示所有其他列。這裏有一個直觀的表:

id  name data 
====================== 
0  john data1 
1  john data2 
2  jane data1 
3  jane data2 
4  jane data3 

因此,作爲結果將顯示:

john 
    data1 
    data2 

jane 
    data1 
    data2 
    data3 

我知道我可以使用DISTINCT得到名稱一次,但我需要得到所有名稱首先查詢,然後做一個循環並運行第二個查詢,或者我可以在一個語句中執行此操作嗎?

現在我有一個foreach使用數組來循環和獲取所有內容。因此,當前顯示爲:

john - data1 
john - data2 
jane - data1 
jane - data2 
jane - data3 

這似乎只是美觀不好,每次顯示的第一列,但我也不太清楚如何有效地去了解這一點。

謝謝你的幫助。

+0

SQL查詢返回結果的方式只是它的樣子 - SQL將返回一個2D數據集,其中每行與周圍的行沒有關係。你所要求的實際上是你輸出格式化的領域,而不是在SQL查詢中完成。如果您發佈用於寫出這些結果的PHP代碼,我們可以建議如何修改它以獲得所需的演示文稿。 –

+3

在PHP中執行此操作,而不是MySQL。讓你的循環檢查名稱是否與前一行相同。只有在名稱標題更改時才顯示。 – Barmar

+0

這不是SQL的工作原理。用於顯示列的控制中斷邏輯應位於表示層而不是數據層。 – xQbert

回答

2

你可以做到這一點沒有采取使用PHP函數MySQL的group_concat函數的優勢在於您正在尋找什麼:

SELECT name, group_concat(`data`) FROM table GROUP BY name; 

將返回一列「John」,第二列返回「data1,data2」。然後,您可以在第二列使用PHP的explode()函數來獲取包含「data1」和「data2」的數組。

+0

我剛剛閱讀了'group_concat',從未使用過它。看起來非常有用,我在phpmyadmin中運行了您的示例的修改版本。這正是我要找的。所以,當它返回結果,並且我在我的'foreach'中時,它會是'explode($ row [2])',然後通過循環運行它? – stinkysGTI

+0

我也發現:http://www.w3resource.com/mysql/aggregate-functions-and-grouping/aggregate-functions-and-grouping-group_concat.php – stinkysGTI

1

這是一個非常簡單的方法:

$prevname = ""; 
while($fetch = $result->fetch_assoc()){ 
    if($prevname !== $fetch['name']){ 
     echo $fetch['name']; 
     $prevname = $fetch['name']; 
    } 
    echo '<br />'. $fetch['data']; 
} 

如果你想讓他們在一個數組manageble:

$arrayt = array(); while($fetch = $result->fetch_assoc()){ 
    $array[ $fetch['name'] ][] = $fetch['data']; 
} 
print_r($array); // will print as your prefered output 
+0

謝謝,這似乎工作。出於某種原因,將它混入我現有的代碼中會將其投入無限循環,但我只是調試它並找出原因。 – stinkysGTI