3

我有一个包含很多名称的数据库 (SQL),我想创建按字母顺序排列的按钮,以便于导航。我找到了很多关于如何在 PHP 中创建字母表的示例。但是,我想根据数据库中的名称构建一个只有有效字母的字母表。

例如:

数据库列出:安德森、贝雷斯福德、多诺万、艾默生、格雷厄姆……

我希望字母表显示为:ABDEG ...

(注意 C 和 F 没有出现)。

我能想到的唯一方法是

- 选择数据库中的每个名字, - 按姓氏排序 - 逐个循环,查找第一个字符是什么,将其保存到数组中, - 循环到第二个,获取第一个字符,看看它是否已经存在数组,如果它确实忽略它 - 一直这样做,直到我留下一个只有不重复字母的数组。

这是唯一的方法吗?还是我错过了一个更简单的解决方案?

提前致谢。

4

3 回答 3

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

请记住,这是对数据库中每一行的字符串操作,然后是未索引的排序操作。一旦表变大,它将根本无法正常运行。

于 2014-03-28T18:10:59.283 回答
1
SELECT LEFT(name, 1) AS firstletter 
FROM database 
GROUP BY firstletter
ORDER BY last_name 

为我工作。

于 2014-03-28T18:16:01.417 回答
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

于 2014-03-28T18:35:47.797 回答