使用PHP打印在起始字母下分组的数据库中的数据?

时间:2015-09-21 08:56:48

标签: php sql

我正在尝试设置for循环来打印以某个字母开头的数据库表中的所有数据。例如,假设从数据库中的所有用户名,我只想打印以字母“b”开头的每个用户名。我想达到的最终结果是:

A
adam
angel
apple

B
ball
bear
blue

C
car
cell
chris

#
0wen
1uis
3than

.,_
.apple.
,car,
_jeff_

我希望能够在它们开头的相应字符下打印所有用户名。我在标题标签下有起始字符,所以我真正需要的是打印它们下面的用户名。我想在每个标题标签下运行一个简单的for循环,过滤那些数据就可以解决这个问题,但是对于我的生活,我无法弄清楚如何去做。到目前为止我的代码(我知道这将打印表中的每个用户):

require_once 'important/connect.php';
$query = $link->prepare('select distinct usr from info order by usr');
$query->execute();
$users = $query->fetchAll(PDO::FETCH_OBJ);
foreach ($users as $user) 
{
    print "<center><a href=\"log.php?id={$user->usr}\" onclick=\"return popUp(this.href)\">{$user->usr}</a></center>";
}

以上代码仅用于展示我正在使用的内容。我正在拍摄以保持每个用户名都作为网址打印,所以当点击用户名时,它会在单独的弹出窗口中显示更多信息,但我已经有了这个工作。无论如何,我将如何实现这一点,或者我想要的方式是不可能的?

3 个答案:

答案 0 :(得分:3)

对于循环,您可以使用此PHP语法:

foreach(range('A','Z') as $letter) {
    //your own code
}

范围会让你像通常使用foreach那样遍历字母。

关于你的问题的一点是关于表现。 如果要返回少量数据,则可以返回整个数组,然后使用php函数进行搜索,以仅操作数组以$letter开头的项目。 如果你有很多项目,最好使用mysql指令LIKE为每个字母运行查询(恕我直言)(因为这会提高性能):

"SELECT usr FROM info WHERE usr LIKE '$letter%' ORDER BY usr GROUP BY usr"

LIKE将只匹配那些以$ letter开头并且还有其他内容的usr。 %是要使用的通配符。

另请注意,在查询中,我使用GROUP BY usr代替SELECT DISTINCT usr来获得相同的结果,因为这是获取唯一用户列表的正确方法。

答案 1 :(得分:1)

正如Lelio Faieta指出的那样,一遍又一遍地遍历用户列表可能对性能不利。但是,一遍又一遍地查询数据库也可能不好。

所以我建议只让用户使用一次,然后按照正确的顺序获取用户:

SELECT usr FROM info ORDER BY usr GROUP BY usr

然后循环浏览它们,并跟踪你所在的起始字母:

$oldLetter = '';
$newLetter = '';
foreach ($users as $user) 
{
    $newLetter = strtoupper(substr($user->usr, 0, 1));
    if($oldLetter != $newLetter)
    {
        //We are on a new letter.
        //Print a heading for all letters between the old one and the new one.
        foreach(range(++$oldLetter, $newLetter) as $letter)
            print '<h2>' . $letter . '</h2>';
        $oldLetter = $newLetter;
     }
     //Print the user, as before.
     print "<center><a href=\"log.php?id={$user->usr}\" onclick=\"return popUp(this.href)\">{$user->usr}</a></center>";
}

这不会照顾最后一组(在您的示例中标题为#)。为此,您需要检查第一个字符是否是SQL中的字母,并以某种方式对其进行排序。

请注意,此代码不支持复制粘贴,您需要对其进行一些操作。例如,如果旧信是Z,则可能存在一些问题。我没有测试过这个,所以你应该在投入生产之前。

答案 2 :(得分:0)

令人讨厌的解决方案的伪代码:

$alphabetArray = array("A","B", etc);

foreach($alphabetArray as $letter) {
    echo '<h2>'.$letter.'</h2>';
    $sql = "SELECT * FROM `usertable` WHERE `username` = '".$letter."%' ORDER BY `username` ASC;"
    // execute sql, loop through and output results
}