Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP从分组在起始字母下的数据库打印数据?_Php_Sql - Fatal编程技术网

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

使用PHP从分组在起始字母下的数据库打印数据?,php,sql,Php,Sql,我试图设置一个for循环,以打印以某个字母开头的数据库表中的所有数据。例如,假设从数据库中的所有用户名中,我只想打印以字母b开头的每个用户名。我想要达到的最终结果是这样的: A adam angel apple B ball bear blue C car cell chris # 0wen 1uis 3than .,_ .apple. ,car, _jeff_ 我希望能够将所有用户名打印在以其开头的相应字符下。我在标题标签下有起始字符,所以我真正需要的是在它们下面打印用户名。我想在每

我试图设置一个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>";
}

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

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

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

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

foreach(range('A','Z') as $letter) {
    //your own code
}
范围将使您像通常使用foreach一样遍历字母

你问题的重点是关于性能。 如果要返回少量数据,可以返回整个数组,然后使用php函数搜索,只处理以$letter开头的数组项。 如果您有许多项,最好使用mysql指令对每个字母运行查询,如这样可以提高性能:

"SELECT usr FROM info WHERE usr LIKE '$letter%' ORDER BY usr GROUP BY usr"
LIKE将只匹配那些以$letter开头的usr,后面还有其他内容。%是要使用的通配符


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

正如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,则可能会出现一些问题。我还没有测试过这个,所以您应该在将它投入生产之前进行测试。

表结构?例如,如果字母X没有用户,您是否仍然希望该字母的列表中没有名字?@foxbeefly是的,我希望该字母显示出来,不管它下面是否有用户名,这就是为什么我在标题标记下有所有的起始字符。@SunilPachlangia如果可以的话,如果可能的话,我希望能够从数据库中获取所有用户名,并使用for循环对其进行过滤。当然,然后你必须对每个字母进行一次查询,但我认为这不会是一个问题。非常感谢你,我原以为对每个字母进行查询会让事情变得有点慢,但确实有效。但是,我确实希望将所有以数字开头的用户名分组到一个类别下,并在另一个类别下包含三个特殊字符。虽然我确信范围对数字很有效,但我能用它来计算吗,还有?这更符合我的要求。但是,有没有一种方法可以打印标题,而不管是否有用户在标题下?@ChrisP.Bacon修复了它。这绝对是可以管理的,我可以很容易地从这里开始工作。非常感谢你,你帮了我大忙@Anders基于现实世界的经验,我可以说PHP中的数组操作功能在性能方面是一场噩梦。如果数组中有很多项,我说的是数百项,或者每个元素都是一个包含很多元素的数组,那么精化时间可能需要几秒钟。使用mysql中的正确数组进行同样的细化,数据库必须组织良好,这将导致几乎立即执行。@LelioFaieta我认为我的代码中没有性能问题。我只对结果迭代一次。我不可能在上面重复更少的次数。还是我在这里遗漏了什么?