2012-11-01 4 views
0

J'ai 4 tables (parmi beaucoup d'autres - juste en montrant les pertinentes). Ils sont:Requête MySQL Tricky avec des jointures?

  • "utilisateurs"
    • id
    • Nom
    • ROLE_ID
  • "rôles"
    • id
    • Nom
  • "chapter_role_view_permissions"
    • id
    • chapter_id
    • ROLE_ID
  • "chapitres"
    • id
    • Nom

J'essaye de construire une requête qui me retournera une liste de tous les utilisateurs, leur nom de rôle, tous les chapitres par utilisateur, et s'ils ont ou non l'accès de vue à chaque chapitre. Disons donc qu'il y a 2 utilisateurs et 2 chapitres. L'utilisateur 1 est role_id = 1 et l'utilisateur 2 est role_id = 2. Et les chapter_role_view_permissions a 1 enregistrement (id: 1 | chapter_id: 1 | role_id: 1) ce qui signifie que seuls les utilisateurs avec role_id = 1 peut voir le chapitre 1.

Le résultat de la requête Je cherche devrait être quelque chose comme:

| --- users.id --- | --roles.id --- | --- chapters.id-- | -can_view_chapter- |

| ------ 1 ------ | ----- 1 ------- | ------- 1 -------- | ----------- 1 ----------- |

| ------ 1 ------ | ----- 1 ------- | ------- 2 -------- | ----------- 0 ----------- |

| ------ 2 ------ | ----- 2 ------- | ------- 1 -------- | ----------- 0 ----------- |

| ------ 2 ------ | ----- 2 ------- | ------- 2 -------- | ----------- 0 ----------- |

Une idée à quoi pourrait ressembler la requête?Je ne veux pas avoir à faire un nouveau champ dans chapter_role_view_permissions qui dit « permis » et insérer de nouveaux enregistrements pour chaque type de rôle soit autorisé = 1 ou autorisé = 0

+0

En prime, j'ai une table supplémentaire, je dois rejoindre les résultats de cette appelés « quiz_user_statuses » qui se joindront aux chapitres. id field et users.id champ qui dit ce que cet utilisateur a marqué sur ce chapitre particulier (et ont NULL si l'enregistrement n'existe pas AKA ils n'ont pas encore pris le quiz du chapitre ou ils n'ont pas la permission de répondre au quiz). – user1418227

Répondre

0

Comme vous avez dit:

Je suis en train de construire une requête qui retourne me une liste de tous utilisateurs, leur nom de rôle, tous les chapitres par utilisateur, et si oui ou non ils ont vue l'accès à chaque chapitre

Juste traduire vos propres mots dans une requête, dans le même ordre:

SELECT users.id, roles.name, chapters.name FROM users 
INNER JOIN roles ON users.role_id=roles.id 
INNER JOIN chapters ON users.id=chapters.id 
WHERE users.id=USER_ID 

Quoi qu'il en soit, vous devez expliquer mieux: comment allez-vous et les utilisateurs des chapitres ayant trait? Je suppose chapters.id est le même que user.id

+0

C'est une situation de plusieurs à plusieurs avec des chapitres et des permissions. Donc, fondamentalement, les utilisateurs se voient attribuer un rôle. Les autorisations de chapitre sont attribuées aux utilisateurs via leur rôle (via la table chapter_role_view_permissions). Je ne sais pas si cela aide à dissiper la confusion. – user1418227

2
SELECT users.name, roles.name, chapters.name 
FROM users 
    LEFT OUTER JOIN roles ON users.role_id = roles.id 
    LEFT OUTER JOIN chapter_role_view_permissions link ON link.role_id = roles.id 
    LEFT OUTER JOIN chapters ON chapters.id = link.chapter_id 
+0

Ceci est proche. Le seul problème est dans ce cas, il reviendrait seulement: | ------ 1 ------ | ----- 1 ------- | ------- 1 -------- | ----------- 1 ----------- | et non les 3 enregistrements où "can_view_chapter" (pas un champ dans la base de données, espérait créer ce champ dans la requête) would = 0. Et pour l'effacer encore plus, j'espérais que can_view_chapter serait booléen. Donc, même si les utilisateurs de role.id = 2 ne peuvent pas voir le chapitre 1 ou le chapitre 2 (car un enregistrement n'existe pas dans chapter_role_view_permissions qui indique chapter_id = 1 et role_id = 2) un enregistrement dans la requête complète apparaitrait avec can_view_chapter = 0 – user1418227

+0

Presque leur besoin d'être un enregistrement pour chaque chapitre par utilisateur. Donc, s'il y a 5 utilisateurs et 5 chapitres, quel que soit le nombre d'enregistrements dans chapter_role_view_permissions, 25 enregistrements doivent être renvoyés (5 chapitres x 5 utilisateurs). Chacun doit me dire l'identifiant de l'utilisateur, l'identifiant du chapitre, et si l'utilisateur a ou non les permissions pour voir ce chapitre. – user1418227

0
SELECT u.id, r.id, c.id, IFNULL(c.id, 0) AS can_view_chapter 
FROM  users AS u 
JOIN  roles AS r ON r.id = u.role_id 
LEFT JOIN chapter_role_view_permissions AS p ON p.role_id = r.id 
JOIN  chapters As c ON c.id = p.chapter_id