postgresql SQL我得到了多行altough我只有一个产品

mlnl4t2r  于 11个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(112)

我有2个产品选项,但我得到了4行它为什么?它显示我的产品选项2x在我的数组
链接到sql在线代码
代码:

SELECT 
      p.id,
      p.shop_id,
      p.provider_id,
      p.name,
      p.status,
      
      json_agg(json_build_object(
        'id', pt.id,
        'tag', pt.tag
      )) AS tags,
      
      json_agg(json_build_object(
        'id', po.id,
        'name', po.name
      )) AS product_options
      
      FROM product p
      
      LEFT JOIN product_options po
      ON po.p_id = p.id
      
      LEFT JOIN product_tags pt
      ON pt.p_id = p.id
      
      WHERE p.id = 1
      
      GROUP BY
      p.id

字符串
你可以看到当你点击链接时,数组中的产品选项中有4个对象,但我只有两条记录,为什么我得到4个?

bq9c1y66

bq9c1y661#

您可以从group by中删除po.id。它将像这样:

SELECT 
      p.id,
      p.shop_id,
      p.provider_id,
      p.name,
      p.status,
      
      json_agg(json_build_object(
        'id', po.id,
        'name', po.name
      )) AS product_options
      
      FROM product p
      
      LEFT JOIN product_options po
      ON po.p_id = p.id
      
      WHERE p.id = 1
      
      GROUP BY
      p.id

字符串
下面是示例结果:

这里是样品提琴链接
对于后续问题,这是因为SQL查询中的连接。当您分别连接product_options和product_tags表时,可能会导致笛卡尔积,从而导致每个产品在product_options和product_tags表中的每个匹配行中重复。为了避免这种情况,您可以使用子查询为每个产品分别执行product_options和product_tags的聚合,然后将它们与主产品表连接起来。
下面是示例代码:

SELECT 
    p.id,
    p.shop_id,
    p.provider_id,
    p.name,
    p.status,
    
    (
        SELECT json_agg(json_build_object(
            'id', pt.id,
            'tag', pt.tag
        ))
        FROM product_tags pt
        WHERE pt.p_id = p.id
    ) AS tags,
    
    (
        SELECT json_agg(json_build_object(
            'id', po.id,
            'name', po.name
        ))
        FROM product_options po
        WHERE po.p_id = p.id
    ) AS product_options
    
FROM product p
WHERE p.id = 1;


下面是输出:



这里是样品提琴链接

相关问题