在MySQL中没有子查询字段的模式计算?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在MySQL中没有子查询字段的模式计算?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2206字,纯文字阅读大概需要4分钟。
内容图文
在我的应用程序中,每个产品组都有许多产品,每个产品都有一个制造商.这些关系由MySQL存储在具有id字段的InnoDB表product_groups中,以及具有id,product_group和manufacturer字段的产品中.
有没有办法在每个产品组中找到最常见的制造商,而无需选择子查询?
这就是我目前正在做的事情:
SELECT product_groups.id,
(
SELECT manufacturer FROM products
WHERE product_group = product_groups.id
GROUP BY manufacturer
ORDER BY count(*) DESC
LIMIT 1
) manufacturer_mode
FROM product_groups;
解决方法:
尝试此解决方案:
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,制造商以及制造商为每个特定组显示的次数.
执行后,FROM子选择看起来像这样(只是在这里编写数据):
product_group | manufacturer | occurrences
---------------------------------------------------
1 | XYZ | 4
1 | Test | 2
1 | Singleton | 1
2 | Eloran | 2
2 | XYZ | 1
现在我们有了子选择结果,我们需要在每个产品组的occurences字段中选出具有最大值的行.
在外部查询中,我们再次通过product_group字段对子选择进行分组,但这次只有product_group字段.现在,当我们在这里进行GROUP BY时,我们可以在MySQL中使用一个名为GROUP_CONCAT的真正引人注目的函数,我们可以使用这些函数将制造商连接在一起并按我们想要的任何顺序连接.
...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...
我们在这里做的是将每个product_group id组合在一起的制造商连接在一起,ORDER BY a.occurrences DESC确保具有最多外观的制造商首先出现在连接列表中.最后,我们将每个制造商与:::分开. product_group 1的结果如下所示:
XYZ:::Test:::Singleton
XYZ首先出现,因为它在出现字段中具有最高值.我们只想选择XYZ,因此我们在SUBSTRING_INDEX中包含连接,这将允许我们仅基于:::分隔符选择列表的第一个元素.
最终结果将是:
product_group | manufacturer_mode
---------------------------------------
1 | XYZ
2 | Eloran
内容总结
以上是互联网集市为您收集整理的在MySQL中没有子查询字段的模式计算?全部内容,希望文章能够帮你解决在MySQL中没有子查询字段的模式计算?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。