2014-03-28 27 views
3

我有一個名稱很多的數據庫(SQL),我想創建按字母順序排列的按鈕,因此很容易導航。我發現了很多關於如何在PHP中創建字母表的示例。但是,我想根據數據庫上的名稱僅使用有效字母來構建字母表。在PHP中創建一個字母表,只有一些字母取決於數據庫中的名稱

例如:

數據庫列表:安德森,貝雷斯福德,多諾萬,艾默生,格雷厄姆....

我想顯示爲字母:ABDEG ...

(請注意,C和F不會出現)。

我能想到的唯一的辦法就是

- 選擇數據庫中的每一個名字, 階按姓氏 -loop一個接一個,找到的第一個字符是什麼,它保存到一個數組, - 回到第二個,獲取第一個字符,看看它是否已經存在於數組中,並且它是否忽略它 - 執行此操作,直到剩下一個只有重複字母的數組。

這是唯一的方法嗎?或者我錯過了一個更簡單的解決方案?

在此先感謝。

+1

您可以使用LEFT(colName,1)僅返回列中的第一個字符。我不知道如何使用這個來獲取字母表的最好方法是......也許選擇DISTINCT LEFT(colName,1)或類似的東西? –

回答

5
SELECT DISTINCT SUBSTRING(lastname,1,1) 'initial' 
FROM people 
ORDER BY initial ASC 

請記住,這是數據庫中每一行的字符串操作,後面跟着一個無索引排序操作。一旦桌子變大,它將而不是表現良好。

+0

如果數據庫上有很多負載,OP可能想要編寫一個array_filter函數或類似的函數來處理PHP的結尾。 –

+0

謝謝!我知道必須有一個更簡單的方法。 – cesarcarlos

+0

我正要問一個類似於線程的問題。謝謝! – abramlimpin

1
SELECT LEFT(name, 1) AS firstletter 
FROM database 
GROUP BY firstletter 
ORDER BY last_name 

適合我。

0

如果你的名字甲肝已經被拉入一個數組,你可以使用這樣的(快速和骯髒的,你想要的東西,也許矯枉過正/需要,但作品!)...

<?php 

$names = array('Anderson','Beresford','Donovan','Emerson','Graham'); 

$alphabet = array(); 
$previous_letter = ''; 

foreach($names as $value) { 
    if($value[0] != $previous_letter) { 
    $alphabet[] = $previous_letter = $value[0]; 
    } 
} 

print_r($alphabet); 

?> 

工作示例這裏:http://3v4l.org/VT0Rt

相關問題