gpt4 book ai didi

mysql - 将非空 CONCAT_GROUP 连接到 MySQL 中的父列

转载 作者:行者123 更新时间:2023-11-29 02:39:55 25 4
gpt4 key购买 nike

我需要从 store_cat 获取类别列表,从 store_item(产品数量)获取子项 COUNT,从 store_cat_attributes(属性列表)获取 GROUP_CONCAT。问题是,使用 CONCAT 函数,我需要将 GROUP_CONCAT 值附加到父表 (store_cat) 中的 name 列,这就是它所在的位置变得棘手。

这很好用:

SELECT
store_cat.id_cat AS id,
store_cat.name AS name,
GROUP_CONCAT(store_cat_attribute.name SEPARATOR ", ") AS attributes,
COUNT(store_item.id_item) AS products,
store_cat.flg_public AS flg_public
FROM store_cat
LEFT JOIN store_item ON store_item.id_cat = store_cat.id_cat
LEFT JOIN store_cat_attribute ON store_cat_attribute.id_cat = store_cat.id_cat
WHERE store_cat.id_store = 1
GROUP BY store_cat.id_cat
ORDER BY name

但这是我真正需要的。问题是,当我执行此查询时,store_cat.name 值在没有属性时显示 empty 值:

SELECT
store_cat.id_cat AS id,
CONCAT(store_cat.name, " (", GROUP_CONCAT(store_cat_attribute.name SEPARATOR ", "), ")") AS name,
COUNT(store_item.id_item) AS products,
store_cat.flg_public AS flg_public
FROM store_cat
LEFT JOIN store_item ON store_item.id_cat = store_cat.id_cat
LEFT JOIN store_cat_attribute ON store_cat_attribute.id_cat = store_cat.id_cat
WHERE store_cat.id_store = 1
GROUP BY store_cat.id_cat ORDER BY name

基本上,store_cat.name 列应该包含带有 CONCATGROUP_CONCAT 的属性列表,就像这样:

  • 科米达斯
  • Correas(S、M、L、XL)
  • Juguetes
  • 医学

这是当前的 SQLfiddle .顺便说一下,当前 GROUP_CONCAT 中的属性顺序有些问题。它显示的是 (XL, S, M, L) 而不是 (S, M, L, XL)。

要解决的问题:

  1. 仅当存在属性时,使用GROUP_CONCAT将属性连接到类别名称。

  2. 使用 store_cat_attributes.position 设置 GROUP_CONCAT 值的顺序。

有什么想法吗?谢谢!

最佳答案

以下表达式应该返回您期望的结果:

CONCAT(
store_cat.name,
IFNULL(
CONCAT(
' (',
GROUP_CONCAT(
store_cat_attribute.name
ORDER BY store_cat_attribute.position
SEPARATOR ', '
),
')'
),
''
)
) AS name

基本上,这只是尝试 GROUP_CONCAT() 属性,如果结果为 NULL,则它会将属性列表变为空字符串。请注意,GROUP_CONCAT 支持 ORDER BY

我还修复了 GROUP BY 子句:在非旧版本的 MySQL 中,所有非聚合列都必须出现在 where 子句中(您缺少 store_cat.name).

Demo on DB Fiddle 使用您的示例数据:

SELECT 
store_cat.id_cat AS id,
CONCAT(
store_cat.name,
IFNULL(
CONCAT(
' (',
GROUP_CONCAT(store_cat_attribute.name ORDER BY store_cat_attribute.position SEPARATOR ', '),
')'
),
''
)
) AS name,

COUNT(store_item.id_item) AS products,
store_cat.flg_public AS flg_public
FROM
store_cat
LEFT JOIN store_item ON store_item.id_cat = store_cat.id_cat
LEFT JOIN store_cat_attribute ON store_cat_attribute.id_cat = store_cat.id_cat
WHERE store_cat.id_store = 1
GROUP BY store_cat.id_cat, store_cat.name
ORDER BY name;
| id  | flg_public | name                  | products || --- | ---------- | --------------------- | -------- || 3   | 1          | Comidas               | 0        || 2   | 1          | Correas (S, M, L, XL) | 4        || 1   | 1          | Juguetes              | 2        || 4   |            | Medicinas             | 0        |

关于mysql - 将非空 CONCAT_GROUP 连接到 MySQL 中的父列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54818447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com