我必须做26次mysql查询在目录列表页面组由a - z


Must I do 26 times mysql query in a directory list page group by A-Z?

我想为我的网站做一个目录列表页面。这个页面显示了我所有的网站文章。这些文章按标题的第一个字母分组。

我必须运行26次mysql查询像

mysql query like "SELECT * FROM articles Where title like 'a%'"
mysql query like "SELECT * FROM articles Where title like 'b%'"
mysql query like "SELECT * FROM articles Where title like 'c%'"
...
mysql query like "SELECT * FROM articles Where title like 'z%'"

和我的html输出是:

<div class="content">
   <p>A</p>
   <a href="somelink">Anhui</a>
   <a href="somelink">Aomen</a>
</div>
<div class="content">
   <p>B</p>
   <a href="somelink">Beijing</a>
</div>
<div class="content">
   <p>C</p>
   <a href="somelink">Chongqing</a>
</div>
...
<div class="content">
   <p>Z</p>
   <a href="somelink">Zhejiang</a>
</div>

所以有什么好的建议,我应该做更少的mysql查询,并得到相同的结果?谢谢。

No。创建一个查询,并按字母顺序排列,如下所示:

SELECT * FROM articles ORDER BY title ASC

然后,当您循环浏览它们以显示它们时,跟踪您显示的最后一篇文章。如果当前文章的第一个字母与最后一个字母不同,则将您的分隔。

$prevFirstLetter = '';
while($data = nextResult()) {
    $firstLetter = substr($data['title'], 0, 1);
    if ($firstLetter != $prevFirstLetter)
        echo "<h1>$firstLetter</h1>";
    echo "{$data['title']}<br>";
    $prevFirstLetter = $firstLetter;
}

请告诉我你试过了

SELECT * FROM `articles` ORDER BY `title`

然后当你循环,跟踪第一个字母(通过使用$string[0]访问),如果它改变,创建新的内容div。

您可以遍历这个查询

SELECT *,LEFT(title,1) FirstLetter FROM articles ORDER BY title ASC 

检查FirstLetter列

只要一遍又一遍地写<a href="somelink">' . $title . </a>,直到FirstLetter从'A'切换到'B'。

我会运行一个查询,让它以排序顺序返回给你,然后在代码中拆分它们。当我能做到这一点时,做26个查询似乎很愚蠢。

您可以在一个查询中选择所有内容,并按标题名称排序。然后,在PHP代码中,当遇到第一个字母的变化时,需要一些逻辑来打破记录集。