【问题标题】:Must I do 26 times mysql query in a directory list page group by A-Z?我必须按 A-Z 在目录列表页组中执行 26 次 mysql 查询吗?
【发布时间】:2011-12-20 21:48:36
【问题描述】:

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

我必须像运行 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 查询并获得相同的结果吗?谢谢。

【问题讨论】:

  • 您为什么不简单地执行 SELECT * FROM 文章 ORDER BY 标题,然后在您正在读取结果集的 for 循环中测试对标题第一个字符的更改?
  • @Mark Ba​​ker:我的笨蛋,我仍然猜不出如何将ABCD 合二为一……

标签: php mysql html


【解决方案1】:

没有。进行单个查询,并按字母顺序对它们进行排序,如下所示:

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;
}

【讨论】:

    【解决方案2】:

    请告诉我你试过了

    SELECT * FROM `articles` ORDER BY `title`
    

    然后,当您循环播放时,跟踪第一个字母(可使用 $string[0] 访问)如果它发生变化,则创建新的内容 div。

    【讨论】:

      【解决方案3】:

      你可以遍历这个查询

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

      检查 FirstLetter 列

      只需一遍又一遍地写&lt;a href="somelink"&gt;' . $title . &lt;/a&gt;,直到FirstLetter 从“A”切换到“B”。

      【讨论】:

        【解决方案4】:

        我会运行一个查询,让它按排序顺序将它们返回给您,然后在它们进入代码后将它们拆分。做 26 次查询似乎很愚蠢,而 1 次就可以了。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2018-05-10
            • 2016-11-25
            • 1970-01-01
            • 2017-10-06
            • 1970-01-01
            • 2016-01-08
            • 1970-01-01
            • 1970-01-01
            • 2012-08-05
            相关资源
            最近更新 更多