首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MySQL和PHP对两个表进行分组

用MySQL和PHP对两个表进行分组
EN

Stack Overflow用户
提问于 2014-05-14 20:50:27
回答 1查看 83关注 0票数 0

我认为这可能更像是PHP而不是SQL,因为我得到的结果是正确的。对于如何实现我所需要的格式,我的头脑是空白的。

我有两张桌子:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

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

编辑:

代码语言:javascript
复制
      <?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();
  }
  ?>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-14 21:10:33

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

代码语言:javascript
复制
<?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();
  }
?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23664853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档