0

产品有两种颜色(黑色和白色)

我想使用 LIMIT 来不带上所有颜色......颜色的数量将是总数


例子:

LIMIT 1 将返回:

  • 颜色名称:“[{“颜色”:“黑色”}]”
  • 数量颜色:int(2)

LIMIT 2 将返回:

  • 颜色名称:[{“颜色”:“黑色”},{“颜色”:“白色”}]
  • 数量颜色:int(2)

我必须在 JSON 中返回名称

但是我看到没有办法在 JSON_ARRAYAGG 中使用 LIMIT

解决方案是在 FROM中使用子查询

它起作用了......我不得不添加 GROUP BY v.id

  • LIMIT 1 只返回一种颜色(OK)
  • LIMIT 2 返回两种颜色(OK)

但是颜色的数量( amountColors )总是 1 在上面两种情况下应该是 2

WITH cte AS (
    SELECT
        pdv.variation_id
    FROM product_detail pd
        INNER JOIN product_detail_variation pdv
            ON (pdv.product_detail_id = pd.id)
    WHERE pd.product_id = -- ID-HERE
)
SELECT
    JSON_ARRAYAGG(colorsName) AS colorsName,
    amountColors
FROM (
    SELECT
        JSON_OBJECT(
            'color', v.name
        ) AS colorsName,
        COUNT(v.id) AS amountColors
    FROM variation v
        INNER JOIN grid g
            ON (g.id = v.grid_id)
    WHERE g.name = 'Color' AND EXISTS (TABLE cte)
    GROUP BY v.id
    LIMIT 1
) v

/* Test: LIMIT 1
array(2) {
  ["colorsName"]=>
  string(20) "[{"color": "Black"}]"
  ["amountColors"] => int(1) // should return int(2)
}*/

/* Test: LIMIT 2
array(2) {
  ["colorsName"]=>
  string(40) "[{"color": "Black"}, {"color": "White"}]"
  ["amountColors"] => int(1) // should return int(2)
}
*/

MySQL版本:8.0+

4

1 回答 1

0

看看这个查询:

WITH cte AS (
    SELECT p.id p_id, p.name p_name,
           pd.id pd_id, pd.price pd_price, pd.stock pd_stock,
           pdv.id pdv_id,
           v.id v_id, v.name v_name,
           g.id g_id, g.name g_name,
           COUNT(*) OVER (PARTITION BY pd.product_id) v_count,
           ROW_NUMBER() OVER (PARTITION BY pd.product_id ORDER BY v.id) v_rn,
           JSON_OBJECT( 'color', v.name ) AS ColorName
    FROM product p
    JOIN product_detail pd ON p.id = pd.product_id
    JOIN product_detail_variation pdv ON pd.id = pdv.product_detail_id
    JOIN variation v ON v.id = pdv.variation_id
    JOIN grid g ON v.grid_id = g.id
    WHERE g.name = 'Color'
      AND pd.product_id = 1
)
SELECT p_name ProductName,
       JSON_ARRAYAGG(ColorName) AS ColorNames,
       v_count ColorsAmount
FROM cte
WHERE v_rn <= @colors_limit
GROUP BY 1, 3

小提琴

核实。任务的逻辑现在对我来说并不完全清楚,我可能错了......

我建议您扩展源数据(添加行)并再次检查(有和没有产品的条件)。

于 2022-02-25T05:06:21.513 回答