【问题标题】:Repeated values with GROUP_CONCAT without using DISTINCT on MySQL query with multiple joins具有 GROUP_CONCAT 的重复值,而不在具有多个连接的 MySQL 查询上使用 DISTINCT
【发布时间】:2014-05-22 00:25:23
【问题描述】:

我有一个类似于下面的架构,我正在尝试进行查询以从单个项目中获取所有过滤器和所有 project_items,以便使用 GROUP_CONCAT 将结果放在一行中。

过滤器

  • 身份证
  • 标题

project_filters

  • 身份证
  • filters_id
  • projects_id

项目

  • 身份证
  • 标题

project_items

  • 身份证
  • 标题
  • projects_id

表是这样连接的

[过滤器] 1--N [project_filters] N--1 [项目] 1--N [project_items]

查询和问题

  • 选择
  • projects.id,
  • projects.title,
  • GROUP_CONCAT(project_items.title) AS items_title,
  • GROUP_CONCAT(filters.title) AS filters_title
  • 来自项目
  • LEFT JOIN project_items ON project_items.projects_id=projects.id
  • LEFT JOIN project_filters ON projects.id=project_filters.projects_id
  • LEFT JOIN 过滤器 ON filters.id=project_filters.filters_id
  • WHERE projects.id="1"

项目 1 有 3 个过滤器(1、2 和 3)和 3 个项目(1、2 和 3),这会导致重复值(每个 9),如下所示:

  • id = 1
  • 标题 = 项目 1
  • items_title = 标题 1、标题 2、标题 3、标题 1、标题 2、标题 3、标题 1、标题 2、标题 3
  • filters_title = 过滤器 1、过滤器 2、过滤器 3、过滤器 1、过滤器 2、过滤器 3、过滤器 1、过滤器 2、过滤器 3

谁能指出我正确的方向?我想知道如何使查询返回过滤器和项目而不重复。

我认为解决方案是以某种方式安排连接,但我想不通。

OBS:带有 DISTINCT 的 GROUP_CONCAT 不适合,因为可能有重复的标题

非常感谢!

【问题讨论】:

    标签: mysql sql join distinct group-concat


    【解决方案1】:

    好的,通过@cha 的回答(感谢伙伴)和更多的研究,我通过删除两个查询之间的 INNER JOIN 得到了正确的结果。

    SELECT i.id, i.title, i.items_title, f.filters_title FROM
    ( SELECT
      projects.id,
      projects.title,
      GROUP_CONCAT(project_items.title) AS items_title
      FROM projects
      LEFT JOIN project_items ON project_items.projects_id=projects.id
      WHERE projects.id="1"
      GROUP BY projects.id) AS i,
    ( SELECT
      projects.id,
      projects.title,
      GROUP_CONCAT(filters.title) AS filters_title
      FROM projects
      LEFT JOIN project_filters ON projects.id=project_filters.projects_id
      LEFT JOIN filters ON filters.id=project_filters.filters_id
      WHERE projects.id="1"
      GROUP BY projects.id) AS f
    WHERE i.id=f.id
    

    【讨论】:

      【解决方案2】:

      对每个 GROUP_CONCAT 使用子查询:

      SELECT i.id, i.title, i.items_title, f.filters_title FROM
      ( SELECT
        projects.id,
        projects.title,
        GROUP_CONCAT(project_items.title) AS items_title
        FROM projects
        LEFT JOIN project_items ON project_items.projects_id=projects.id
        group by projects.id,
        projects.title) as i
      INNER JOIN
      ( SELECT
        projects.id,
        projects.title,
        GROUP_CONCAT(filters.title) AS filters_title
        FROM projects
        LEFT JOIN project_filters ON projects.id=project_filters.projects_id
        LEFT JOIN filters ON filters.id=project_filters.filters_id
        group by projects.id,
        projects.title) as f
      ON i.id = f.id
      WHERE i.id="1"
      

      【讨论】:

      • 谢谢@cha,但现在我得到的是:id = 1 title = project 1 items_title =标题 1,标题 2,标题 3,标题 1,标题 2,标题 3 filters_title = 过滤器 1,过滤器 2,过滤器 2,过滤器 3,过滤器 3 但你给了我一些想法,我将尝试实施它们并报告!谢谢!
      • 好的,忘记分组了。试试这个解决方案。请注意,如果没有最后一个 where 子句,我的解决方案而不是您的解决方案将正常工作
      • 是的,现在可以了!我也忘了按我在我的解决方案中使用的分组,将为其他人更新它......谢谢!
      猜你喜欢
      • 2016-09-22
      • 1970-01-01
      • 2021-06-20
      • 2014-02-25
      • 2012-05-12
      • 1970-01-01
      • 2019-05-29
      • 2019-01-30
      • 1970-01-01
      相关资源
      最近更新 更多