2016-12-09 4 views
1

Я работаю с базой данных mysql, но перед вами стоит проблема. У меня есть список пользователей, который выглядит примерно так.Объединение столбцов в отдельные столбцы с мостом

Users 
+----+------+ 
| ID | Name | 
+----+------+ 
| 1 | Jim | 
| 2 | Cal | 
| 3 | Rob | 
| 4 | John | 
| 5 | Paul | 
+----+------+ 

Теперь у меня есть еще две таблицы,

Teams   Role 
+----+----------+ +---+------+ 
| ID | NameTeam | |ID | Role | 
+----+----------+ +---+------+ 
| 1 | Team1 | | 1 |Leader| 
| 2 | Team2 | | 2 |Member| 
| 3 | Team3 | | 3 |Role3 | 
| 4 | Team4 | | 4 |Role4 | 
| 5 | Team5 | | 5 |Role5 | 
+----+----------+ +---+------+ 

Пожалуйста, не то, что все идентификаторы являются первичными ключами.

Наконец, есть таблица, которая служит мостом для таблиц выше.

  Bridge 
+---------+--------+--------+ 
| ID_team | ID_user| ID_role| 
+---------+--------+--------+ 
| 1  | 1  | 1  | 
| 1  | 2  | 2  | 
| 1  | 3  | 3  | 
| 2  | 4  | 1  | 
| 2  | 5  | 2  | 
| 2  | 1  | 3  | 
+---------+--------+--------+ 

Все эти три столбца являются внешними ключами, которые связаны с первичными ключами в трех таблицах «Пользователи, команды и роль».

Что мне нужно - это список всех пользователей и в одном столбце информации о командах, в которых они входят, а также о роли, которую они играют в этой команде. Я решил, что смогу сделать это с помощью левого соединения, но для пользователя может быть связано несколько команд, а затем строка будет дублироваться.

Мой запрос до сих пор:

select * from Users 
LEFT OUTER JOIN Bridge 
ON Bridge.UserID = Users.UserID; 

Какие результаты в дубликатах, как:

Result 
+----+------+---------+--------+--------+ 
| ID | Name | ID_team | ID_user| ID_role| 
+----+------+---------+--------+--------+ 
| 1 | Jim | 1  | 1  | 1  | << Twice Jim here 
| 1 | Jim | 2  | 1  | 3  | << 
| 2 | Cal | 1  | 2  | 2  | 
| 3 | Rob | 1  | 3  | 3  | 
| 4 | John | 2  | 4  | 1  | 
| 5 | Paul | 2  | 5  | 2  | 
+----+------+---------+--------+--------+ 


    Desired result 
+----+------+----------------------------+ 
| ID | Name | Team and role    | 
+----+------+----------------------------+ 
| 1 | Jim | Team1: Leader,Team2:role3 | <<Nice sum up. 
| 2 | Cal | Team1: Member    | 
| 3 | Rob | Team1: Role3    | 
| 4 | John | Team2: Leader    | 
| 5 | Paul | Team2: Member    | 
+----+------+----------------------------+ 

ли что-то подобное возможно даже с помощью одного запроса? Если бы не я, я мог бы всегда создавать что-то подобное, используя php, но было бы очень приятно, если бы это был единственный запрос.

Так что мой вопрос в том, как я могу получить желаемый результат?

+0

Несомненно, вам необходимо, чтобы стол бриста разбивался на 2 таблицы моста 1) Пользователь находится в команде и 2) Пользователь имеет роль – RiggsFolly

ответ

1

Сначала вам нужно соединить все таблицы.

Для получения желаемого результата вам необходимо использовать CONCAT вместе с функцией GROUP_CONCAT.

SELECT 
U.ID, 
U.Name, 
GROUP_CONCAT(CONCAT(T.NameTeam,':',R.Role)) AS 'Team and Role' 
FROM Bridge B 
INNER JOIN Users U ON U.ID = B.ID_user 
INNER JOIN Teams T ON T.ID = B.ID_team 
INNER JOIN Role R ON R.ID = B.ID_role 
GROUP BY B.ID_user 

EDIT:

Для того, чтобы получить результат для всех пользователей, независимо от того, существует ли соответствующая запись в Bridge таблице или нет:

SELECT 
U.ID, 
U.Name, 
GROUP_CONCAT(CONCAT(T.NameTeam,':',R.Role)) AS 'Team and Role' 
FROM Users U 
LEFT JOIN Bridge B ON U.ID = B.ID_user 
LEFT JOIN Teams T ON T.ID = B.ID_team 
LEFT JOIN Role R ON R.ID = B.ID_role 
GROUP BY U.ID; 

SEE DEMO

+0

Спасибо вам за ваш ответ. Есть только одна маленькая вещь, которую я вижу, я мог забыть упомянуть. Если пользователь не является частью команды, он все равно должен быть указан. Я попытался использовать ваш ответ с разными типами Joins, но это, похоже, не сработало. Возможно ли это? Остальная часть стола вышла идеально! – Daan

+0

Вам необходимо изменить порядок, а также переключиться с 'INNER JOIN' на' LEFT JOIN'. Проверьте обновленный ответ в разделе ** edit **. @Daan – 1000111

+0

Именно то, что я искал! – Daan

Смежные вопросы