【问题标题】:Group PHP results on first letter of name在名称的第一个字母上分组 PHP 结果
【发布时间】:2011-07-20 10:08:24
【问题描述】:

我有一个查询,它获取按姓氏排序的所有记录。现在我想创建一个循环,按姓氏的第一个字母对这些结果进行分组,并在组上方显示字母,即

A
-----------
Albert
Alfred

C
-----------
Charles

D
-----------
Delta etc...

谢谢!

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    MySQL 一侧按lastname 对结果进行排序,并在PHP 一侧跟踪第一个字母的变化:

    <?php
    
    $rs = mysql_query("SELECT * FROM mytable ORDER BY lastname");
    
    while ($rec = mysql_fetch_assoc($rs)) {
        if ($initial !== strtoupper(substr($rec['lastname'], 0, 1)) {
            $initial = strtoupper(substr($rec['lastname'], 0, 1));
            print "$initial\n";
        }
        print $rec['lastname'] . "\n";
    }
    
    ?>
    

    【讨论】:

    • 这个有效...在将 $initial !== strtoupper(substr($rec['lastname'], 1, 1) 更改为 $initial !== strtoupper(substr($rec[ '姓氏'], 0, 1)
    【解决方案2】:
    $letter = null;
    foreach ($array as $word) {
      if ($letter != $word[0]) {
        $letter = $word[0];
        echo '<b>'.strtoupper($word[0]) . '</b><br/>';
      }
      echo strtoupper($word) . '<br/>';
    }
    

    和游览查询添加行:

    order by `your_field` asc
    

    【讨论】:

    【解决方案3】:

    已经尝试过类似的方法了吗?

    $last = '';
    foreach($data as $key=>$row){
        if(substr($row['last_name'],0,1)!=$last) echo '<br /><br />'.substr($row['last_name'],0,1).'<br />----------------<br />';
        $last = substr($row['last_name'],0,1);
        echo $row['last_name'];
    }
    

    【讨论】:

    • 令人印象深刻!我写得太慢了! :D
    【解决方案4】:

    在您看来,您可以循环记录并拆分它们:

    $current = '';
    foreach ($rows as $r) {
        if (!$current || strtolower($r['name'][0]) != $current) {
            $current = strtolower($r['name'][0]);
            echo strtoupper($current).'<br />---------------';
        }
        echo $row['name'].'<br />';
    }
    

    【讨论】:

      【解决方案5】:

      在您的查询中,尝试添加如下内容:

      group by substr(last_name,1,1)
      

      select substr(last_name,1,1) as alpha, *
      from tableName
      group by substr(last_name,1,1)
      

      【讨论】:

      • 这只会为每个首字母返回一条记录
      • Quassnoi 是对的。请改用ORDER BY LEFT(last_name,1) ASC。顺便说一句..只要您想查询所有行,您将无法检索此类“被阻止”的结果。最后你必须在你的代码中做最后的“阻塞”。
      【解决方案6】:

      是的,您可以使用 MySql 本身来实现这一目标

      在我的情况下,brand_name 将按照您的预期列出。

      例子:

      SELECT id, upper(SUBSTR(brand_name, 1, 1))  AS alpha FROM products WHERE  brand_name != ''  group by alpha
      UNION
      SELECT id, upper(SUBSTR(brand_name, 1, 1))  AS alpha FROM products WHERE  brand_name != '' order by brand_name COLLATE NOCASE
      

      结果:

          A
          A Card
          A Cef
          A Cef O
          B
          Bacticef Tab
          Bacticin
          Bactidrox
          Bactidrox Kid
          ........
      

      希望对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-04
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多