Mysql 关联表中 group by 多余字段显示你用对了吗?
SELECT
GROUP_CONCAT(DISTINCT t1.order_uuid) AS order_uuid ,
t4.depart_name,
t4.uuid
FROM
itsm_order_assign t1
INNER JOIN itsm_order t2 ON
t2.uuid = t1.order_uuid
INNER JOIN suninfo_userasset.t_user_info t3 ON
t3.uuid = t1.assign_user
INNER JOIN suninfo_userasset.t_department_info t4 ON
t4.uuid = t3.depart_uuid
WHERE
t3.status = 1
AND t1.assign_type IN (2, 3, 4)
AND t1.create_time >= 1684598400
AND t1.create_time <= 1684684799
GROUP BY
t4.uuid
在我的回答中,c.category_name
确实没有在 GROUP BY
子句中指定,这意味着按照这个字段分组时,出现了多个不同的值。
在标准的 SQL 中,如果你在 SELECT
子句中使用了一个没有在 GROUP BY
子句中出现的列,那么 SQL 引擎会尝试对这个列进行聚合操作来计算这个列上的值。对于某些数据库系统来说,这个行为是可以关闭或禁用的。如果启用了这个行为,则 SQL 引擎可以在不被统一的列上使用聚合函数,比如 SUM()
、AVG()
、COUNT()
等计算所有符合条件的记录的值。
但是,不同的数据库系统可能会有不同的默认行为。有些数据库系统可能会抛出一个错误,告诉你不能在 SELECT
子句中使用未出现在 GROUP BY
子句中的列。因此,在使用此语句时,最好将所有要在列中显式出现的列都包含在 GROUP BY
子句中,并明确指定聚合函数来计算其他列的值。
再次抱歉之前的误导,希望我的更正对你有所帮助。
```
SQL 示例
假设我们有两个表 categories 和 products,其中 categories 包含类别的信息,products 包含产品的信息和所属的类别 ID。我们想要查询每个类别的 ID、名称和产品数量。
SELECT c.id, c.category_name, COUNT(p.id) AS product_count
FROM categories c
LEFT JOIN products p ON c.id = p.category_id
GROUP BY c.id, c.category_name
ORDER BY c.id;
SQL
以上 SQL 语句将使用 LEFT JOIN 操作符,联结 categories 和 products 表格数据,以便获取每个类别及其下的产品数量。这里使用 COUNT 聚合函数统计每个类别下的产品数量。在 GROUP BY 子句中指定了 c.id 和 c.category_name,以分类分组数据。最后使用 ORDER BY 子句按 c.id 排序结果集。
博客文章总结
SQL 中使用 LEFT JOIN 进行表格联结时,能够获取左边表格所有的数据和右边表格中匹配的数据,对于右边表格没有匹配的数据,使用 NULL 值代替。这对于需要查询某些有 NULL 值的数据非常有用。
在查询数据时,可以使用聚合函数进行统计,如 COUNT、SUM、AVG 等。在 GROUP BY 子句中指定按照某个字段分组,从而进行数据分类统计。使用 ORDER BY 子句进行排序。
数据库设计时,需要考虑表格之间的关联关系。在本例中,products 表格中的 category_id 字段被用来与 categories 表格中的 id 字段建立起关联关系。这样就能够方便地查询类别下的所有产品。
SQL 语句的优化对于查询效率至关重要。在本例中,使用 LEFT JOIN 操作符会产生较高的开销,当数据量大时,效率会降低。要尽可能使用 INNER JOIN 操作符,避免使用子查询,使用索引优化查询等方式来提高查询效率。
希望这些博客文章总结对于大家学习SQL有所帮助。
本作品采用《CC 协议》,转载必须注明作者和本文链接