有没有更好的方法在PHP / MySQL中创建字母分页索引?

时间:2011-07-05 20:26:41

标签: php mysql pagination

我在CMS中进行分页的标准行为之一是在按字母列排序时显示字母快速栏。例如,如果结果按姓氏排序,则在分页下我输出一系列链接A到Z,以直接转到特定第一个字符的页面。

示例:

目前我这样做是通过获取该列的所有结果,按字母顺序排序,然后在PHP中循环遍历它们并记录记录显示在哪个页面上。当你只处理几百个结果时,这种方法很好,但我现在正在研究一个可能有几十万行的项目,而这根本不是一个可行的选择。

有没有更有效的方法来制作这种索引?请注意,它还需要处理的不仅仅是A-Z,因为行可能以数字或标点符号开头。

编辑以澄清: 我不是在寻找所有第一个角色的简单列表,这很容易。我需要计算从该角色开始的字段的总结果页面。所以说我们正在寻找一个名叫沃尔特的人,我有1000行,我需要知道W在这个1-1000范围内的位置。

4 个答案:

答案 0 :(得分:8)

我认为它是一个varchar字段,所以你考虑过以下几点:

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;

无需对每个字母进行第二次查询。

答案 1 :(得分: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本身并没有内置任何“行号”支持,所以它是一个非常难看的查询。

答案 2 :(得分:0)

就像在标准分页上只需要获取和排序一样 - 只需添加带有A%的WHERE(不要忘记在此列上创建索引)

答案 3 :(得分: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 } ?>
如果你用你的变量/表名替换

,那么

可能是你想要的。

将检查表格,从该字母中拉出每个字母的第一个字母,并将其输出为

1 3 7 9 A B R W X Y Z

取决于您在表格中的内容