GROUP BY 一列但不是同一表中的另一列-SQL [重复]

Posted

技术标签:

【中文标题】GROUP BY 一列但不是同一表中的另一列-SQL [重复]【英文标题】:GROUP BY one column but not the other column within same table - SQL [duplicate] 【发布时间】:2021-05-21 05:54:19 【问题描述】:

我有一个名为“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 *** 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列。希望我说得通 您写了“结果如下:”。查询不可能导致您显示的内容。 【参考方案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。

以上是关于GROUP BY 一列但不是同一表中的另一列-SQL [重复]的主要内容,如果未能解决你的问题,请参考以下文章

转换后将数据从一列复制到同一表中的另一列

原则 ORDER BY 列但 DISTINCT 在另一列

比较两个列并从同一个表中的另一列获取数据

使用同一表中另一列的数据计数更新一列? [关闭]

熊猫:从数据透视表中的另一列中减去一列

SQL 从另一个表中的另一列更新一列