【问题标题】:Display data once if same如果相同,则显示一次数据
【发布时间】:2013-09-18 21:11:12
【问题描述】:

使用此代码:

    $query = "select users.id_user, users.full_name, users.rights, users.group, group.id, group.name
     from users
        inner join group
            on users.group=group.id
                    where users.rights= 2";

    // connection code

    while ($re = mysql_fetch_array($res))

    {
            $id_user = $re["id_user"];
            $id_group = $re["id"];
            $full_name= $re["full_name"]; 
            $group_name= $re["name"];

        echo "<div>";
        echo "<p><strong>$group_name</strong></p>";
        echo "$full_name<br />";
        echo "</div>";  
    }

    ?>

我明白了:

组 1
用户1

组 1
用户2

组 2
用户3

组 2
用户4

我需要这样的:

组 1
用户1
用户2

组 2
用户3
用户4

如何只显示一次组名?

【问题讨论】:

  • 在您的循环中,跟踪看到的最后一个组名并将当前记录与该记录进行比较;然后相应地调整你的输出。
  • 按照@eggyal 的建议做,但也要在查询末尾添加ORDER BY group.name, user.full_name(假设User1User2 等是user.full_name)。

标签: php mysql


【解决方案1】:

调整您的查询,使用数据库功能为您提供所需的信息。

select 
   usergroup.name 
 , GROUP_CONCAT(user.name SEPARATOR '<br />') 'users'

from 
 user

inner join 
 usergroup

on
 user.usergroup_id = usergroup.id

where 
 user.rights = 2

group by 
  usergroup.id

在你的 php 中查看演示 http://sqlfiddle.com/#!2/0d104/1 你可以使用 $row['users']

【讨论】:

  • SQL 不应该用于数据表示,这不是它的用途。
  • 个人喜好问题,但 SQL(结构化查询语言)是一种专用编程语言,旨在管理关系数据库管理系统 (RDBMS) 中保存的数据。最初基于关系代数和元组关系演算,SQL 由数据定义语言和数据操作语言组成……我想我是否在这里操作数据????
  • 不,您操纵的是数据的显示方式,而不是从数据库返回的数据,这是完全不同的事情。例如,您可以查找 MVC 以了解它应该如何分离。
  • 您的正确率约为 80% +! MVC 可以用于此,但这在内存使用和 CPU 方面会更好,因为 PHP 没有额外的运行来操作数据。并且 GROUP_CONCAT 不是真正的数据库可移植的,如果你想要可移植的 SQL 代码,你确实应该在你的视图中处理这个
  • 真的没有机会检查它是否是更好的内存使用,但无论如何它充其量是过早的优化。
【解决方案2】:

您可以在此任务中使用关联数组。例如,创建一个数组 $groups,并在您的 while 循环中执行类似

的操作
    $groups[$re["name"]]["full_name"][] = $re["full_name"];

然后,当您通过 $groups 显示您的 html 循环并在其中循环通过全名时。

【讨论】:

    【解决方案3】:

    这是我想出的:

    $query = "SELECT users.id_user, users.full_name, users.rights, users.group, group.id, group.name
             FROM users
             INNER JOIN group
             ON users.group=group.id
             WHERE users.rights=2
             ORDER BY group.name ASC";
    
    // connection code
    
    $group_name = '';
    
    while ($re = mysql_fetch_array($res))
    {
        if( $group_name === '' )
        {
            $group_name = $re["name"];
            echo "<div>";
            echo "<p><strong>$group_name</strong></p>";
        }
        elseif( $group_name !== $re["name"] )
        {
            $group_name = $re["name"];
            echo "</div>";
            echo "<div>";
            echo "<p><strong>$group_name</strong></p>";
        }
    
        $id_user = $re["id_user"];
        $id_group = $re["id"];
        $full_name= $re["full_name"]; 
    
        echo "$full_name<br />";
    
    }
    
    ?>
    

    它基本上是按组名对结果进行排序,并且在迭代时,正在检查组名。如果相同,只打印名称,如果不同,则关闭 div,新建一个并回显新的组标题。

    【讨论】:

      猜你喜欢
      • 2015-02-16
      • 2021-09-23
      • 2017-02-16
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      相关资源
      最近更新 更多