mysql – 将group_concat的结果集限制为实际结果
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 将group_concat的结果集限制为实际结果,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3940字,纯文字阅读大概需要6分钟。
内容图文
![mysql – 将group_concat的结果集限制为实际结果](/upload/InfoBanner/zyjiaocheng/893/800a54ac0a294db5b8288cd5469b4457.jpg)
我有以下查询主要工作,但当其中一个连接表返回的结果数不同时,在group_concat()中返回太多结果:
select
a.sku, a.ek, a.mwst,
concat('[[', group_concat('{"offer": ', b.offer, ', "minQuantity": ', b.minQuantity, '}') , ']]') offersA,
concat('[[', group_concat('{"offer": ', c.offer, ', "minQuantity": ', c.minQuantity, '}') , ']]') offersB,
concat('[[', group_concat('{"offer": ', d.offer, ', "minQuantity": ', d.minQuantity, '}') , ']]') offersC
from all_prices a
left join all_prices_a b on a.sku = b.sku
left join all_prices_b c on a.sku = c.sku
left join all_prices_c d on a.sku = d.sku
where a.sku in (123,456)
group by a.sku
我得到的结果是(请运行代码片段查看表格)或查看fiddle
<table border=1>
<tr>
<td bgcolor=silver class='medium'>sku</td>
<td bgcolor=silver class='medium'>ek</td>
<td bgcolor=silver class='medium'>mwst</td>
<td bgcolor=silver class='medium'>offersA</td>
<td bgcolor=silver class='medium'>offersB</td>
<td bgcolor=silver class='medium'>offersC</td>
</tr>
<tr>
<td class='normal' valign='top'>123</td>
<td class='normal' valign='top'>154.32</td>
<td class='normal' valign='top'>19</td>
<td class='normal' valign='top'>[[{"offer": 9.65, "minQuantity": 3},{"offer": 9.86, "minQuantity": 1}]]</td>
<td class='normal' valign='top'>[[{"offer": 9.66, "minQuantity": 1},{"offer": 9.66, "minQuantity": 1}]]</td>
<td class='normal' valign='top'>[[{"offer": 9.65, "minQuantity": 1},{"offer": 9.65, "minQuantity": 1}]]</td>
</tr>
<tr>
<td class='normal' valign='top'>456</td>
<td class='normal' valign='top'>48.48</td>
<td class='normal' valign='top'>19</td>
<td class='normal' valign='top'>[[{"offer": 13.30, "minQuantity": 1},{"offer": 13.30, "minQuantity": 1}]]</td>
<td class='normal' valign='top'>[[{"offer": 13.30, "minQuantity": 1},{"offer": 122.00, "minQuantity": 3}]]</td>
<td class='normal' valign='top'>NULL</td>
</tr>
</table>
如您所见,例如offersB包含两个结果
[[{"offer": 9.66, "minQuantity": 1},{"offer": 9.66, "minQuantity": 1}]]
如果两者都相等,则数据库中只有一个条目用于给定的sku 123,但offersA对此sku的不同数量有两个不同的要约:
[[{"offer": 9.65, "minQuantity": 3},{"offer": 9.86, "minQuantity": 1}]]
我以后使用JavaScript处理结果,所以我可以删除重复的结果 – 但我想知道是否存在
a)一种更聪明的查询数据的方法
b)一种在查询本身中删除这些重复项的方法
解决方法:
试试这个:
SELECT a.sku, a.ek, a.mwst,
CONCAT('[[', b.offersA , ']]') offersA,
CONCAT('[[', c.offersB , ']]') offersB,
CONCAT('[[', d.offersC , ']]') offersC
FROM all_prices a
LEFT JOIN ( SELECT b.sku, GROUP_CONCAT('{"offer": ', b.offer, ', "minQuantity": ', b.minQuantity, '}') AS offersA
FROM all_prices_a b
GROUP BY b.sku
) AS b ON a.sku = b.sku
LEFT JOIN ( SELECT c.sku, GROUP_CONCAT('{"offer": ', c.offer, ', "minQuantity": ', c.minQuantity, '}') AS offersB
FROM all_prices_b c
GROUP BY c.sku
) AS c ON a.sku = c.sku
LEFT JOIN ( SELECT d.sku, GROUP_CONCAT('{"offer": ', d.offer, ', "minQuantity": ', d.minQuantity, '}') AS offersC
FROM all_prices_c d
GROUP BY d.sku
) AS d ON a.sku = d.sku
WHERE a.sku IN (123, 456);
检查这个SQL FIDDLE DEMO
:: OUTPUT ::
| sku | ek | mwst | offersA | offersB | offersC |
|-----|-------|------|---------------------------------------------------------------------------|----------------------------------------|----------------------------------------|
| 123 | 12.48 | 19 | [[{"offer": 12.28, "minQuantity": 1},{"offer": 11.24, "minQuantity": 3}]] | [[{"offer": 12.28, "minQuantity": 1}]] | [[{"offer": 12.28, "minQuantity": 1}]] |
| 456 | 13.24 | 19 | [[{"offer": 10.00, "minQuantity": 1},{"offer": 9.00, "minQuantity": 3}]] | [[{"offer": 9.00, "minQuantity": 3}]] | [[{"offer": 9.00, "minQuantity": 3}]] |
内容总结
以上是互联网集市为您收集整理的mysql – 将group_concat的结果集限制为实际结果全部内容,希望文章能够帮你解决mysql – 将group_concat的结果集限制为实际结果所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。