Mysql SQL";分组方式;仅返回第一行-bis
我从中了解到:MySQL只返回为组找到的第一个值 为了简化,我有以下表格:Mysql SQL";分组方式;仅返回第一行-bis,mysql,sql,group-by,Mysql,Sql,Group By,我从中了解到:MySQL只返回为组找到的第一个值 为了简化,我有以下表格: Products ---------------- id | description ---------------- 1 | Product-1 2 | Product-2 3 | Product-3 Groups ------ id | description ---------------- 1 | Group-1 2 | Group-2 nxm_Products_Groups ---------
Products
----------------
id | description
----------------
1 | Product-1
2 | Product-2
3 | Product-3
Groups
------
id | description
----------------
1 | Group-1
2 | Group-2
nxm_Products_Groups
---------------------
product_id | group_id | qty
---------------------
1 | 1 | 10
1 | 2 | 10
2 | 1 | 10
3 | 1 | 10
最后一个表是产品和组之间的多对多关联表
我想按产品分组,汇总它们的数量(qty
),当所有汇总的产品都在一个组中时,我想选择组名,否则我想返回“?”
MySQL总是返回它找到的第一个组:
SELECT
G.id AS GROUP_ID,
G.description,
P.id AS PRODUCT_ID,
P.description,
SUM(GP.qty) AS QTY
FROM
Groups G
JOIN nxm_Products_Groups GP ON (G.id = GP.group_id)
JOIN Products P ON (P.id = GP.product_id)
GROUP BY P.id
ORDER BY GP.group_id;
我得到:
GROUP_ID|description|PRODUCT_ID|description|QTY
1 |Group 1 |2 |Product-2 |10
1 |Group 1 |3 |Product-3 |10
1 |Group 1 |1 |Product-1 |20
编辑:也许我的问题不清楚。我想要的不是我得到的,而是:
GROUP_ID|description|PRODUCT_ID|description|QTY
1 |Group 1 |2 |Product-2 |10
1 |Group 1 |3 |Product-3 |10
??? |??? |1 |Product-1 |20
如何使用?您不能使用
?
而不是组ID
,因为它是一个INT字段。例如,您可以使用0
。尝试使用案例
:
SELECT
CASE WHEN COUNT(*)=1 THEN G.id ELSE 0 END AS GROUP_ID,
CASE WHEN COUNT(*)=1 THEN G.description ELSE '\?\?' END AS GROUP_DESC,
P.id AS PRODUCT_ID,
P.description,
SUM(GP.qty) AS QTY
FROM
Groups G
JOIN nxm_Products_Groups GP ON (G.id = GP.group_id)
JOIN Products P ON (P.id = GP.product_id)
GROUP BY P.id
ORDER BY GROUP_ID;
没有真正意义吗?常规GROUP BY规则是:如果指定了GROUP BY子句,则SELECT列表中的每个列引用必须标识分组列或是集合函数的参数。第一句话不正确。MySQL被明确地记录为从不确定的行返回值,而不是从第一行返回值(dev.MySQL.com/doc/refman/5.6/en/group by handling.html)。@jarlh完全正确,事实并非如此!我的查询应该会给出一个错误…@GordonLinoff好的,谢谢,但这不是问题的重点。您是否仍希望在第一列中看到组id 1,但是您不想在第二列中看到组id 1的描述?是的,但在这种情况下,此字段
组id
将在结果集中自动转换为VARCHAR