首页 > 解决方案 > 如何显示每个组的所有行

问题描述

问题是每组 column2 只显示每组一个项目。我尝试使用 ORDER BY 但 column3 克隆每一行。示例图片

<?php 
$sql = "SELECT * 
        FROM tbl_menu 
            JOIN tbl_cat ON tbl_menu.cat_id = tbl_cat.cat_id 
        GROUP BY cat_name";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        $menu_id = $row['menu_id'];
        $cat_id = $row['cat_id'];
        $menu_name = $row['menu_name'];
        $cat_name = $row['cat_name'];
?>
    <div class="col-sm-4">
      <h3 class="font-weight-light" value="cat_id"><?php echo $cat_name; ?></h3>
      <div class="custom-control custom-switch">
        <input type="checkbox" class="custom-control-input" id="<?php echo $menu_id; ?>" value="<?php echo $menu_name; ?>">
        <label class="custom-control-label" for="<?php echo $menu_id; ?>"><?php echo $menu_name; ?></label>
      </div>
    </div>
<?php 
    }
} 
?>

样品表:

+------+------+--------+
| Col1 |cat_id|  Col3  |
+------+------+--------+
|    1 |    1 | Orange |
|    2 |    1 | Mango  |
|    3 |    2 | Grapes |
|    4 |    2 | Apple  |
|    5 |    3 | Banana |
+------+------+--------+

输出是每组只显示一行。例如:在 ID 为 1 的 column2 中,它将仅显示橙色。

标签: phpsql

解决方案


是的,当您在禁用 ONLY_FULL_GROUP_BY 模式的情况下运行 MySQL 时会发生这种情况

通常,如果您没有按不在聚合函数中的任何列在组中提及,数据库会抱怨:

--throws an error - AddressCity must be present in the group by, or in an aggregate function
SELECT Name, AddressCity, AVG(Age) as AvgAge
FROM Person
GROUP BY Name

--this is ok - we group by the city too
SELECT Name, AddressCity, AVG(Age) as AvgAge
FROM Person
GROUP BY Name, AddressCity

--this is also ok - we get the max city in the select
SELECT Name, MAX(AddressCity), AVG(Age) as AvgAge
FROM Person
GROUP BY Name

聚合函数是诸如 MIN、MAX、AVG、SUM、COUNT、STDDEV 等

您的查询未在 GROUP BY 中完全指定 SELECT 中不在聚合函数中的列。从逻辑上讲,没有任何好的或一致的方法可以让您的查询工作,因为您没有明确说明您希望数据库做什么,所以 MySQL 只是猜测(它任意选择单个值来使查询工作)。你可以想象它是这样工作的:

SELECT Name, CHOOSE_RANDOM(AddressCity), AVG(Age) as AvgAge
FROM Person
GROUP BY Name

这意味着对于以下数据:

Name, AddressCity, Age
John, London, 30
John, Paris, 40

它产生:

John, London, 35

或者:

John, Paris, 35

名称John是分组的,所以数据库知道如何处理它。年龄是平均的,所以平均 35 岁。然后 MySQL 只是选择伦敦或巴黎,无论感觉如何(它选择的内容可能有规则,但因为你没有具体说你不能确定)

那么对于“我想要所有约翰的平均年龄,以及所有约翰居住地点的完整列表”的情况该怎么办?

您在子查询中进行分组和平均,然后将此汇总数据连接回您的详细信息:

SELECT 
  p.Name, p.AddressCity, summary.AvgAge
FROM
  Person p
  INNER JOIN
  (SELECT Name, AVG(Age) as AvgAge FROM Person GROUP BY Name) summary
  ON p.Name = summary.Name

哦,启用 ONLY_FULL_GROUP_BY 以便 MySQL 在您没有正确完全分组/聚合查询时抛出错误。在没有 ONLY_FULL_GROUP_BY 的情况下运行有点像在 VB 中编程——它让你玩得又快又松,但实际上鼓励错误代码,因为它默默地修补语法错误,但它并没有给你想要的东西,因为它鼓励一种开发方式你不准确的地方


推荐阅读