2011-07-05 36 views
7

我的CMS內分頁標準行爲之一是在按alpha列排序時顯示字母快捷欄。例如,如果結果按姓氏排序,則在分頁下,我會輸出一系列鏈接A到Z,以直接將您帶到特定首字符的頁面。有沒有更好的方法在PHP/MySQL中創建字母分頁索引?

例子:

目前我通過獲取所有結果該列,按字母順序排序,然後通過他們全部循環在PHP和錄音出現在哪一頁記錄這樣做。當你只處理幾百個結果時,這可以正常工作,但我現在正在研究一個可能有幾十萬行的項目,但這不是一個可行的選擇。

是否有更高效的方法來產生這種索引?請注意,它也需要處理的不僅僅是A-Z,因爲行可以以數字或標點符號開頭。

編輯澄清: 我不是在尋找所有的第一個字符的簡單列表,這很容易。我需要計算從該字符開始的字段總結果的哪個頁面。所以說我們正在尋找一個名叫沃爾特的人,而我有1000排,我需要知道W的起點在1-1000的範圍內。

回答

8

我相信這是一個varchar字段拉從每個第一個字母,組由字母和輸出它作爲

1 3 7 9 A B R W X Y Z 

,所以你考慮以下內容:

SELECT DISTINCT SUBSTRING(lastname FROM 1 FOR 1) FROM mytable; 

這會得到一個清晰的名字的第一個字母。

你也可以使用UPPER()來確保你得到大寫字母。 LEFT()也會實現類似的功能,因此您應該嘗試查看哪些數據集的執行速度最快。

編輯:如果你也想計數:

SELECT DISTINCT SUBSTRING(lastname FROM 1 FOR 1) AS firstletter, COUNT(*) AS counter FROM mytable GROUP BY firstletter; 

無需對每個字母做了第二次查詢。

+0

問題更新更清晰。我需要的不僅僅是所有第一個字符的列表。 – ChiperSoft

+0

後編輯:嗯,計數,可以工作。使用每個字符的數量來查找它將會在的頁面。 – ChiperSoft

+0

這工作完美。循環播放結果並總結所有參賽作品之前,給出了我正在尋找的結果。謝謝! – ChiperSoft

0

就像上STANDRD分頁僅僅是一個獲取和排序的事情 - 只是當需要與%添加(不要忘記在此列上創建索引)

0
<?php 
$result1 = mysql_query("SELECT LEFT(name, 1) AS fl FROM comics GROUP BY fl"); 
while ($row = mysql_fetch_array($result1)) 
{ 
$result11 = mysql_query("SELECT * FROM comics WHERE name LIKE '".$row['fl']."%'"); 
$countresult11 = mysql_num_rows($result11); 
?> 
<a href="?sort=<?php echo $row['fl']; ?>" title="<?php echo $countresult11; ?> Comics"><?php echo $row['fl']; ?></a>&nbsp;  
<?php } ?> 

可能是有點兒你在找什麼,如果你用你的替換我的變量/表名稱。

,將檢查表,這取決於你在桌子上

+0

謝謝,但那不是我想要的。我已經更新了這個問題,以便更清楚。 – ChiperSoft

1
$sql = "SELECT left(name, 1) AS firstchar FROM mytable ORDER BY name"; 

$result = mysql_query($sql) or die(mysql_error()); 

$letters = array(); 
$row = 0; 
while($row = mysql_fetch_assoc($result)) { 
    $row++; 
    if (!isset($letters[$row['firstchar']])) { 
     $letters[$row['firstchar']] = $row; 
    } 
} 

這將使您的第一個字母鍵的排列,他們第一次出現在該值的行數:

a => 1, 
b => 50, 
c => 51, 

等..

有可能是在SQL純粹做的一些方法,但MySQL的本身並沒有任何「行號」的支持內置的,所以它會是一個非常醜陋的查詢。

+0

這是我以前做過的方式,但是當查詢返回幾十萬條結果時,這會崩潰。這對每個頁面請求來說都是太多的處理。 – ChiperSoft

相關問題