使用MySQL &对2个表进行分组PHP


Grouping results from 2 tables with MySQL & PHP

我认为这可能是一个PHP的事情比SQL的结果我有是正确的。我脑子里一片空白,不知道如何实现我需要的格式。

我有两个表:

privilege;
+--------------------+---------------------+------+-----+---------+----------------+
| Field              | Type                | Null | Key | Default | Extra          |
+--------------------+---------------------+------+-----+---------+----------------+
| privilege_id       | bigint(20)          | NO   | PRI | NULL    | auto_increment |
| privilege_group_id | bigint(20)          | NO   |     | NULL    |                |
| privilege_name     | varchar(255)        | NO   |     | NULL    |                |
+--------------------+---------------------+------+-----+---------+----------------+
privilege_group;
+----------------------+--------------+------+-----+---------+----------------+
| Field                | Type         | Null | Key | Default | Extra          |
+----------------------+--------------+------+-----+---------+----------------+
| privilege_group_id   | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| privilege_group_name | varchar(255) | NO   |     | NULL    |                |
+----------------------+--------------+------+-----+---------+----------------+

我需要像这样输出查询结果:

权限组名

  • 权限组1
  • 权限组2

另一个权限组名称

  • 另一个权限组1
  • 另一个权限组2

我的查询返回正确的结果:

SELECT privilege_group.privilege_group_name, privilege.privilege_name FROM privilege LEFT JOIN privilege_group ON privilege.privilege_group_id = privilege_group.privilege_group_id ORDER BY privilege_group.privilege_group_id ASC

我只是不太确定如何在每个孩子的第一个结果之后忽略特权组名称。例:我明白了:

权限组名

  • 权限组1

权限组名

    权限组2

另一个权限组名称

  • 另一个权限组1

另一个权限组名称

  • 另一个权限组2

我知道我可以用2个查询循环实现这一点,但上面返回正确的数据,我只是不知道如何处理它!

编辑:

      <?php
  try {
$rnum = ''; 
$stmt = $dbh->prepare("SELECT privilege_group.privilege_group_name,privilege.privilege_name
FROM privilege
LEFT JOIN privilege_group ON privilege.privilege_group_id = privilege_group.privilege_group_id
ORDER BY privilege_group.privilege_group_id ASC");          
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
      $rnum++;
// I know I need some conditional around this to only show it once per group!
if () {  
echo "<b>$row[privilege_group_name]</b><br />";
//
}
  echo "$row[privilege_name]<br />"; 
} 
  }
  catch(PDOException $e){
echo 'Error : '.$e->getMessage();
exit();
  }
  ?>

首先,将privilege_group.privilege_group_id添加到SELECT语句中,然后:

<?php
  try {
    $stmt = $dbh->prepare(
        "SELECT privilege_group.privilege_group_id,
             privilege_group.privilege_group_name,
             privilege.privilege_name
         FROM privilege
         LEFT JOIN privilege_group ON
             privilege.privilege_group_id = privilege_group.privilege_group_id
         ORDER BY privilege_group.privilege_group_id ASC");
    $last_group_id = -1;
    $stmt->execute();
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
      if ($last_group_id != $row['privilege_group_id']) {
        echo "<b>" . $row['privilege_group_name'] . "</b><br />";
        $last_group_id = $row['privilege_group_id'];
      }
      echo $row['privilege_name'] . "<br />";
    }
  } catch(PDOException $e) {
    echo 'Error : '. $e->getMessage();
    exit();
  }
?>