我有一个类似于下面的架构,我正在尝试进行查询以从单个项目中获取所有过滤器和所有 project_items,以便使用 GROUP_CONCAT 结果仅在一行中。
过滤器
- 编号
- 标题
项目过滤器
- 编号
- filters_id
- 项目编号
项目
- 编号
- 标题
项目项目
- 编号
- 标题
- 项目编号
表格是这样连接的
[过滤器] 1--N [project_filters] N--1 [项目] 1--N [project_items]
疑问与问题
- 选择
- 项目.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
- 在 filters.id=project_filters.filters_id 上左加入过滤器
- WHERE projects.id="1"
项目 1 有 3 个过滤器(1、2 和 3)和 3 个项目(1、2 和 3),这导致重复值(每个 9 个),如下所示:
- id = 1
- title = 项目 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 不适合,因为可能有重复的标题
非常感谢!
最佳答案
好吧,通过@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
关于mysql - 使用 GROUP_CONCAT 重复值而不在具有多个连接的 MySQL 查询上使用 DISTINCT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22951748/