Mysql很少左加入重复结果[关闭]

分享于2022年07月17日 left-join mysql 问答
【问题标题】:Mysql很少左加入重复结果[关闭](Mysql few left join duplicate results [closed])
【发布时间】:2022-01-23 06:16:12
【问题描述】:

两次左连接的结果与第二次左连接中的记录重复的次数相同 当存在多个左连接时会出现问题。

如何编辑它以解决问题? 提前致谢。

    SELECT
            `p`.*,
            GROUP_CONCAT(CONCAT(`pi`.`id`, '-', `pi`.`img_path`) SEPARATOR ',') AS `images`,
            GROUP_CONCAT(`fp`.`filter_id` SEPARATOR \',\') AS `filter_options`
        FROM
            `products` AS `p`
        LEFT JOIN
            `product_images` AS `pi` ON (`pi`.`product_id` = `p`.`id`)
        LEFT JOIN
            `filters_products` AS `fp` ON (`fp`.`product_id` = `p`.`id`)
        WHERE
            `p`.`id` = ?
        GROUP BY
            `p`.`id`

  • product_images 表中是否有重复 ID?
  • product_id 位于两个表的每一行,以了解哪个产品有问题
  • 我是说它们是重复的吗?
  • 你不能合法地选择 products 中的所有列,只能按 id 分组,如果你只选择 p.Id 会发生什么
  • Edit 问题并提供 minimal reproducible example ,即涉及的表或其他对象的 CREATE 语句(粘贴 文本 ,不要使用图像,不要链接到外部站点), INSERT 用于示例数据 (dito) 的语句以及带有表格文本格式的示例数据的所需结果。

【解决方案1】:

这里的问题是,如果左连接有多个具有给定 ID 的行,则 group_concat 中的结果也会成倍增加。有几种方法可以解决这个问题,但可能最简单的方法是使用 DISTINCT 关键字。虽然,如果预期结果可能有多个相似的值,它将无法正常工作。另一种方法是使用子查询而不是连接。

以下是给定查询中 DISTINCT 的示例:

SELECT
            `p`.*,
            GROUP_CONCAT(DISTINCT CONCAT(`pi`.`id`, '-', `pi`.`img_path`) SEPARATOR ',') AS `images`,
            GROUP_CONCAT(DISTINCT `fp`.`filter_id`  SEPARATOR \',\') AS `filter_options`
        FROM
            `products` AS `p`
        LEFT JOIN
            `product_images` AS `pi` ON (`pi`.`product_id` = `p`.`id`)
        LEFT JOIN
            `filters_products` AS `fp` ON (`fp`.`product_id` = `p`.`id`)
        WHERE
            `p`.`id` = ?
        GROUP BY
            `p`.`id`

  • 没错,我修改了答案