首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mysql -- "group group_concat()“的可能解决方案?

Mysql -- "group group_concat()“的可能解决方案?
EN

Stack Overflow用户
提问于 2014-02-10 09:46:22
回答 1查看 99关注 0票数 0

是否可以根据聚合函数的结果对结果进行分组,而不将结果嵌套在其上?

代码语言:javascript
运行
复制
"SELECT b.pizza, GROUP_CONCAT(t.topping_names SEPARATOR ',') AS topping_string FROM bascket AS b
LEFT JOIN toppings AS t ON t.pizza = b.pizza 
 GROUP BY pizza, topping_string "  

上面的查询应该返回按所选topping_string分组的所有比萨(应该返回唯一的pizza+toppings)。但是当然,这是无效的,因为group_concat是在分组之后完成的。因此,我看到的唯一选择是包装该查询并使其成为实际分组的子查询:

代码语言:javascript
运行
复制
SELECT sub.* FROM (  
SELECT b.pizza, GROUP_CONCAT(t.topping_names SEPARATOR ',') AS topping_string FROM bascket AS b
    LEFT JOIN toppings AS t ON t.pizza = b.pizza  
) AS sub  
GROUP BY sub.pizza, sub.topping_string  

这样做合适吗?还有别的选择吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-10 10:00:49

是的,这是正确的方法,如果您正在执行两个聚合,除了在子查询中执行第一个聚合之外,别无选择。

但是,您没有任何聚合,因此可以使用DISTINCT强制执行唯一性。

代码语言:javascript
运行
复制
SELECT  DISTINCT 
        b.pizza, 
        GROUP_CONCAT(t.topping_names SEPARATOR ',') AS topping_string
FROM    bascket AS b
    LEFT JOIN toppings AS t 
        ON t.pizza = b.pizza
GROUP BY b.pizza;

注:如果您确实需要在子查询中执行聚合,则应该是:

代码语言:javascript
运行
复制
SELECT sub.*, COUNT(*) AS Quantity FROM (  
SELECT b.pizza, GROUP_CONCAT(t.topping_names SEPARATOR ',') AS topping_string 
FROM bascket AS b
    LEFT JOIN toppings AS t ON t.pizza = b.pizza  
GROUP BY b.pizza
) AS sub  
GROUP BY sub.pizza, sub.topping_string  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21673706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档