【问题标题】:GROUP BY one column but not the other column within same table - SQL [duplicate]GROUP BY 一列但不是同一表中的另一列-SQL [重复]
【发布时间】:2023-03-09 19:52:01
【问题描述】:

我有一个名为“department_categories”的表,其中包含 3 列“id”、“category”和“department”:

id | category    | department

1  | chainsaw    | garden and home
2  | jet-ski     | lifestyle
3  | generator   | garden and home
4  | tractor     | agriculture
5  | rtv         | lifestyle

现在我想要实现的是显示每个部门内的所有类别。以下查询

$sql = "SELECT category, department FROM department_categories GROUP BY department

结果如下:

garden and home | lifestyle | agriculture
                |           |
chainsaw        | jet-ski   | tractor

这很有意义,因为 GROUP BY 根据指定的列对所有行进行分组。但是我正在寻找的结果是:

garden and home | lifestyle | agriculture
                |           |
chainsaw        | jet-ski   | tractor
generator       | rtv

我遇到了following stackoverflow question。这似乎是我遇到的类似问题,但我无法解决它。

为了更清楚,这是我正在使用的完整脚本:

<?php
$host       = "localhost";
$username   = "root";
$password   = "";
$dbname     = "auro-rudamans";
$dsn        = "mysql:host=$host;dbname=$dbname";
$options    = array(
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
              );

$connection = new PDO($dsn, $username, $password, $options)

try {

    $sql = "SELECT category, department FROM department_categories GROUP BY department";

        $statement = $connection->prepare($sql);
        $statement->execute();
        $result = $statement->fetchAll();
    }

    catch(PDOException $error) {
      echo $sql . "<br>" . $error->getMessage();
    };      
?>

<?php foreach ($result as $row) : ?>
<ul>
    <h1><?php echo $row['department']; ?></h1>
    <li><?php echo $row['category']; ?></li>
</ul>
<?php endforeach; ?>

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 您的第一个查询无法产生您显示的结果。您只选择 2 列,如何在输出中获得 3 列?
  • 并且查询不能在不同的行中返回不同数量的列。使用GROUP_CONCAT() 将所有类别收集到一个分隔字符串中。
  • 可以使用GROUP_CONCAT() MySQL函数
  • @Barmar 感谢您的回复。我知道只有 2 列。查看部门列有 3 个不同的值(花园、生活方式、农业)和其他列类别。换句话说,我只想列出每个部门一次,然后在每个部门下列出相关部门下的类别。使用 GROUP BY 我得到了我正在寻找的结果,但它只显示每个部门的 1 个类别,而不是显示一个部门的所有类别。所以输出仍然是2列。希望我说得通
  • 您写了“结果如下:”。查询不可能导致您显示的内容。

标签: php sql group-by


【解决方案1】:

它可以通过不同的方法来完成,但如果你想通过你的 php 代码来完成,那么你应该执行一个查询,在其中你将只得到部门

select departments from department_categories group by departments

并在 while 循环中传递此查询并仅获取变量中的部门

$department = row['departments'];

然后在while循环中调用另一个查询来获取类别

select * from department_categories  where department = $department
$query = "select * from department_categories group by departments;
$result = mysqli_query($query);

while($row = mysqli_fetch_array($result)){
    $department = $row['departments'];
    $category_query = "select * from departments where department = $departments";
    
    $result_categories = mysqli_query($category_query);
    
    while($row_category = mysqli_fetch_array($result_categories)){
        echo $row_category['category'];
    }

}

【讨论】:

  • 您在$category_query 中缺少$departments 周围的引号。最好使用准备好的语句。
  • $query 应该是SELECT DISTINCT department FROM department_categories
  • 他使用的是 PDO,而不是 mysqli。
猜你喜欢
  • 2023-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 2013-02-15
相关资源
最近更新 更多