MySQL SELECT по ссылке с конкатенацией - PullRequest
1 голос
/ 13 мая 2011

Вот проблемы ...

У меня есть 4 таблицы: users, groups, users_groups и emails. Обратите внимание, что users_groups ссылается на таблицу groups и users. Другими словами, каждый раз, когда пользователь присоединяется к группе, userId и groupId вводятся в таблицу users_groups. Пользователь может присоединиться к нескольким группам.

CREATE TABLE app.users (
`id` INT NOT NULL AUTO_INCREMENT ,
`firstName` INT NOT NULL ,
`lastName` INT NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE = InnoDB;

CREATE TABLE app.groups (
`id` INT NOT NULL AUTO_INCREMENT ,
`groupName` VARCHAR(32) NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE = InnoDB;

CREATE TABLE app.users_groups (
`id` INT NOT NULL AUTO_INCREMENT ,
`userId` INT NOT NULL ,
`groupId` INT NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE = InnoDB;

CREATE TABLE app.emails (
`id` INT NOT NULL AUTO_INCREMENT ,
`userId` INT NOT NULL ,
`email` VARCHAR(32) NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE = InnoDB;

Теперь я хотел бы запросить эти таблицы и отобразить результат следующим образом:

 +---------+-------------------+--------------+
 |name     |emails             |groups        |
 +---------+-------------------+--------------+
 |John Doe |johndoe@mail.com,  |group1,group2,|
 |         |johndoe2@mail.com  |group3        |
 +---------+-------------+---------+----------+

1 Ответ

2 голосов
/ 13 мая 2011

Вы можете использовать group_concat для этого:

select  concat(u.Firstname, ' ', u.Lastname) as name
,       group_concat(distinct e.email separator ',') as emails
,       group_concat(distinct g.groupName separator ',') as groups
from    users u
left join
        users_groups ug
on      ug.userId = u.id
left join
        groups g
on      g.Id = ug.GroupId
left join
        emails e
on      e.UserId = u.Id
group by
        u.Id
,       u.Firstname
,       u.Lastnmae
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...