gpt4 book ai didi

mysql - group_concat 在 MySQL 中有多个连接

转载 作者:可可西里 更新时间:2023-11-01 06:43:39 28 4
gpt4 key购买 nike

数据库架构

create table `questions` (
`id` int not null auto_increment,
`title` varchar(45) not null,
primary key (`id`));

create table `tags` (
`id` int not null auto_increment,
`question_id` int not null,
`name` varchar(45) not null,
primary key (`id`));

create table `comments` (
`id` int not null auto_increment,
`question_id` int not null,
`body` varchar(45) not null,
primary key (`id`));

insert into questions (title) values
("title1"), ("title2"), ("title3");

insert into tags (question_id, name) values
(1, "javascript"), (1, "php"), (1, "c#"), (2, "mysql"), (2, "php"), (3, "c#");

insert into comments (question_id, body) values
(1, "comment1"), (1, "comment1"), (1, "comment2"), (3, "comment3");

这就是它在视觉上的样子:

问题

| id |  title |
|----|--------|
| 1 | title1 |
| 2 | title2 |
| 3 | title3 |

标签

| id | question_id |       name |
|----|-------------|------------|
| 1 | 1 | javascript |
| 2 | 1 | php |
| 3 | 1 | c# |
| 4 | 2 | mysql |
| 5 | 2 | php |
| 6 | 3 | c# |

评论

| id | question_id |     body |
|----|-------------|----------|
| 1 | 1 | comment1 |
| 2 | 1 | comment1 |
| 3 | 1 | comment2 |
| 4 | 3 | comment3 |

每个问题都必须至少有一个标签。它也可以有 0 个或多个评论。同一个问题可以有两条评论。

期望的输出

我想选择所有问题,即他们的id、标题、标签和评论。

输出应该是这样的:

| id |  title |       tags        |          comments          |
|----|--------|-------------------|----------------------------|
| 1 | title1 | c#,php,javascript | comment1,comment1,comment2 |
| 2 | title2 | php,mysql | (null) |
| 3 | title3 | c# | comment3 |

尝试解决问题

我尝试了以下查询:

select questions.id, questions.title,
group_concat(tags.name), group_concat(comments.body)
from questions
join tags on questions.id = tags.question_id
left join comments on questions.id = comments.question_id
group by questions.id

不幸的是,它没有按预期工作。它产生以下输出:

| id |  title | group_concat(distinct tags.name) |                                                      group_concat(comments.body) |
|----|--------|----------------------------------|----------------------------------------------------------------------------------|
| 1 | title1 | c#,php,javascript | comment1,comment1,comment1,comment2,comment2,comment2,comment1,comment1,comment1 |
| 2 | title2 | php,mysql | (null) |
| 3 | title3 | c# | comment3 |

如您所见,对于第一个问题,每个评论我都会收到三次,因为这个问题上有三个标签。

此外,评论的顺序错误。它们的顺序应与插入时的顺序相同,即 comment1,comment1,comment2,而不是 comment1,comment2,comment1

我不能使用 distinct 来评论,因为一个问题上可以有多个相同正文的评论。

我知道这可能可以通过嵌套的 select 来解决,但据我所知这会对查询的性能产生巨大的负面影响。

SQL fiddle

The SQL Fiddle使用数据库模式和我的查询。

最佳答案

您需要首先聚合并应用GROUP_CONCAT,然后加入:

select questions.id, questions.title,
tags.name, comments.body
from questions
join (
select question_id, group_concat(tags.name) as name
from tags
group by question_id
) tags on questions.id = tags.question_id
left join (
select question_id, group_concat(comments.body) as body
from comments
group by question_id
) comments on questions.id = comments.question_id

关于mysql - group_concat 在 MySQL 中有多个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37432077/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com