php - 如何显示每个组的所有行
问题描述
问题是每组 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 中,它将仅显示橙色。
解决方案
是的,当您在禁用 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 中编程——它让你玩得又快又松,但实际上鼓励错误代码,因为它默默地修补语法错误,但它并没有给你想要的东西,因为它鼓励一种开发方式你不准确的地方
推荐阅读
- azure-synapse - 我无法使用 Gzip COMPRESSION 查询数据
- javascript - 函数调用后嵌套对象消失
- docker - 如何同时登录多个 docker 注册表?
- c - 有人可以告诉我为什么 void 功能不起作用吗?为什么它停在主要功能而不完成其余部分?
- amazon-web-services - 在创建 EC2 期间将 Terraform 实例属性引用到用户数据
- php - 如何从 Laravel 注册 Firebase 用户?
- php - switch/case 和 if else 的行为不同
- unit-testing - Golang:创建用于测试文件读取功能的临时目录
- python - 如何在 tkinter 网格中设置最大列数?
- python - 无法加载动态库“cudart64_110.dll”;dlerror: cudart64_110.dll not found ,我有 tensorflow.version==2.6.0