2011-07-20 45 views
5

我有一個查詢,它獲取由last_name排序的所有記錄。現在,我想創建一個循環,團體,這些結果進行姓氏的第一個字母,顯示該組以上的字母,即在名字的第一個字母組上的PHP結果

A 
----------- 
Albert 
Alfred 

C 
----------- 
Charles 

D 
----------- 
Delta etc... 

謝謝!

回答

9

訂單上MySQL側的結果通過lastname和跟蹤PHP側的第一個字母的變化:

<?php 

$rs = mysql_query("SELECT * FROM mytable ORDER BY lastname"); 

while ($rec = mysql_fetch_assoc($rs)) { 
    if ($initial !== strtoupper(substr($rec['lastname'], 0, 1)) { 
     $initial = strtoupper(substr($rec['lastname'], 0, 1)); 
     print "$initial\n"; 
    } 
    print $rec['lastname'] . "\n"; 
} 

?> 
+0

這一個工作...在改變後$ initial!== strtoupper(substr($ rec ['lastname'],1,1)to $ initial!== strtoupper(substr($ rec ['lastname'],0,1) –

0
在查詢

,嘗試添加類似:

group by substr(last_name,1,1) 

select substr(last_name,1,1) as alpha, * 
from tableName 
group by substr(last_name,1,1) 
+0

這將只爲每個首字母返回單個記錄 – Quassnoi

+0

Quassnoi是正確的。改用'ORDER BY LEFT(last_name,1)ASC'。順便說一句..只要你想查詢所有行,你將無法檢索到這種「封鎖」的結果。最後,你將不得不在你的代碼中做最後的「阻塞」。 – Marco

4
$letter = null; 
foreach ($array as $word) { 
    if ($letter != $word[0]) { 
    $letter = $word[0]; 
    echo '<b>'.strtoupper($word[0]) . '</b><br/>'; 
    } 
    echo strtoupper($word) . '<br/>'; 
} 

,並遊覽查詢添加一行:

order by `your_field` asc 
+0

相同的問題和解決方案在[MySQL組由php concat](http://stackoverflow.com/questions/6719061/mysql-group-by-php-concat/6719354#6719354) – knittl

2

在你看來,你可能然後循環記錄並將它們分開:

$current = ''; 
foreach ($rows as $r) { 
    if (!$current || strtolower($r['name'][0]) != $current) { 
     $current = strtolower($r['name'][0]); 
     echo strtoupper($current).'<br />---------------'; 
    } 
    echo $row['name'].'<br />'; 
} 
3

已歷經嘗試這樣的事情?

$last = ''; 
foreach($data as $key=>$row){ 
    if(substr($row['last_name'],0,1)!=$last) echo '<br /><br />'.substr($row['last_name'],0,1).'<br />----------------<br />'; 
    $last = substr($row['last_name'],0,1); 
    echo $row['last_name']; 
} 
+0

令人印象深刻!太慢了!:D – Marco

0

是的,你可以使用MySql本身

在我的情況BRAND_NAME將是名單出如您所願地實現這個目標。

例子:

SELECT id, upper(SUBSTR(brand_name, 1, 1)) AS alpha FROM products WHERE brand_name != '' group by alpha 
UNION 
SELECT id, upper(SUBSTR(brand_name, 1, 1)) AS alpha FROM products WHERE brand_name != '' order by brand_name COLLATE NOCASE 

結果:

A 
    A Card 
    A Cef 
    A Cef O 
    B 
    Bacticef Tab 
    Bacticin 
    Bactidrox 
    Bactidrox Kid 
    ........ 

希望它會幫助別人。

相關問題