尝试这个解决方案:
SELECT
a.product_group,
SUBSTRING_INDEX(GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'), ':::', 1) AS manufacturer_mode
FROM
(
SELECT
aa.product_group,
aa.manufacturer,
COUNT(*) AS occurrences
FROM
products aa
GROUP BY
aa.product_group,
aa.manufacturer
) a
GROUP BY
a.product_group
解释:
这仍然使用一种子查询形式,但它只执行一次,而不是像原始示例那样逐行执行。
它的工作原理是首先选择product_group
id、制造商以及制造商在每个特定组中出现的次数。
The FROM
子选择执行后看起来像这样(这里只是弥补数据):
product_group | manufacturer | occurrences
---------------------------------------------------
1 | XYZ | 4
1 | Test | 2
1 | Singleton | 1
2 | Eloran | 2
2 | XYZ | 1
现在我们有了子选择结果,我们需要选出具有最大值的行occurences
每个产品组的字段。
在外部查询中,我们再次按product_group
场,但这一次,only the product_group
场地。现在当我们做我们的GROUP BY
在这里,我们可以使用 MySQL 中一个非常引人注目的函数,称为GROUP_CONCAT
我们可以使用它以我们想要的任何顺序将制造商连接在一起。
...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...
我们在这里所做的是将按每个分组在一起的制造商连接在一起product_group
是个ORDER BY a.occurrences DESC
确保出现次数最多的制造商first在串联列表中。最后我们将每个制造商分开:::
。这样做的结果为product_group
1
看起来像:
XYZ:::Test:::Singleton
XYZ
首先出现,因为它具有最高的值occurance
场地。我们only想要选择XYZ
,所以我们将串联包含在SUBSTRING_INDEX
,这将允许我们仅根据:::
分隔符。
最终结果将是:
product_group | manufacturer_mode
---------------------------------------
1 | XYZ
2 | Eloran