сложный запрос MySQL с несколькими таблицами (читайте подробнее) - PullRequest
2 голосов
/ 02 февраля 2012

У меня есть 4 таблицы: команды, пользователи, пользовательские команды и разрешения:

пользователи:

UserID | Name
------------------------
1      | John
2      | Mike
3      | Tom

команды:

TeamID | Name
-------------------------------
1      | FC Barcelona
2      | Real Madrid
3      | Manchester United
4      | Liverpool

разрешения:

PermissionsID | Name
-------------------------------
1             | Read Comments
2             | Write Comments
3             | Send Email
4             | Admin

UserTeams:

ID | UserID | TeamID | PermissionID
--------------------------------------------
1  | 1      | 1      | 1
2  | 1      | 1      | 2
3  | 1      | 1      | 4
4  | 1      | 2      | 1
4  | 1      | 4      | 3

-

-

UserID = 1 (мы знаем это до запроса)

Я хочусделайте запрос, чтобы получить что-то вроде этого:

Permission.Name | FC Barcelona | Real Madrid | Manchester United | Liverpool | etc...
----------------------------------------------------------------------------
Read Comments   | (something)  | (something) | NULL              | NULL
Write Comments  | (something)  | NULL        | NULL              | NULL
Send Email      | NULL         | NULL        | NULL              | (something)
Admin           | (something)  | NULL        | NULL              | NULL

Количество команд не ограничено.

Есть идеи?Я не против, если есть несколько запросов ...

Спасибо заранее!

РЕШЕНИЕ

Первый выбортолько команды:

SELECT TeamID, name FROM Teams

Затем создайте новый запрос с данными команд:

SELECT     
Permissions.name as 'permissionName', 

<Loop this line with the previous query>
    MAX(CASE WHEN Teams.name = 'FC Barcelona' THEN Teams.name ELSE NULL END) AS 'FC Barcelona'
<End loop>

FROM Permissions
LEFT JOIN UserTeams ON UserTeams.PermissionID = Permissions.PermissionID AND UserTeams.UserID = '1' 
LEFT JOIN Teams ON Teams.TeamID = UserTeams.TeamID   
GROUP BY Permissions.name  

Теперь у нас есть именно тот результат, который мы хотели.

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Ну, я думаю, что ваши таблицы неполные .. где будет хранится '(что-то)'

0 голосов
/ 02 февраля 2012

Количество столбцов в результате запроса не является переменным, вы всегда получите одинаковое количество столбцов. Поэтому я бы порекомендовал результат запроса, подобный этому:

Permission     | Team                |  User_name |  User_id
-----------------------------------------------------------------
Read Comments  | FC Barcelona        | John       | 1
Write Comments | Real Madrid         | John       | 1
Send Email     | Manchester United   | Mike       | 2
Admin          | ...(unlimited)      | Tom        | 2

(конечно, с правильными значениями;))

SQL-запрос для этого будет:

SELECT 
    p.Name AS Permission,
    u.Name AS User_name,
    t.Name AS Team,
    u.id AS User_id
FROM
    UserTeams AS ut
INNER JOIN
    Users AS u ON (ut.UserId = u.UserId)
INNER JOIN
    Teams AS t ON (ut.TeamId = t.TeamId)
INNER JOIN
    Permissions AS p ON (ut.PermissionId = p.PermissionsId)
WHERE
    u.UserID = :userId
...