Bonjour,
voici les données du problème (tables non modifiables):
voila mes 3 tables simplifiées pour l'exemple (les liaisons se font sur id_dossier et id_user) :
# [dossiers] -> (id_dossier, nom_dossier)
# [liaison_dossier] -> (id_user, id_dossier, type_user)
# [users] -> (id_user, nom_user)
il existe 3 type d'utilisateurs (type_user) => A, B, et C
chaque utilisateur se connecte sur 1 type par defaut et ne verra que certaines données en fonction de son type.
mais il aura la possiblité de basculer sur 1 autre type à tout moment s'il existe sur 1 ou plusieurs autre type.
le but étant d'afficher la liste des dossiers ou l'utilisateur est présent en fonction de son type.
ex. je me connecte en type C, donc je vais afficher tous les dossiers où je suis présent en tant qu'utilisateur de type C
jusque là j'arrive bien a faire ma requete (ex. ci-dessous) :
-> je retourne les dossiers ou je suis présent en tant que type C :
Code : Tout sélectionner
SELECT dossiers.* FROM dossiers
LEFT JOIN liaison_dossier ON dossiers.id_dossier = liaison_dossier.id_dossier
WHERE liaison_dossier.id_user = 'XXX' AND type_user = 'C'
GROUP BY liaison_dossier.id_dossier
ceci fonctionne bien (dites moi si on peut faire mieux au niveau de la requete).
seulement c'etait trop beau pour continuer et un autre type (D) vient s'ajouter et c'est là que ça se complique.
en effet, ce dernier peut prendre la valeur des autres types.
voici les cas de figure sur un dossier avant le nouveau type (D):
1 - A-B-C
2 - A-B
voici tous les cas maintenant :
1: A-B-C
2: A-B
3: A-B-D (D est considéré comme C)
4: B-C-D (D est considéré comme A)
5: B-D (D est considéré comme A)
6: A-B-C-D (on ne tient pas compte de D)
je suis A => je suis dans les cas 1,2,3,4,5 et 6 (tous).
je suis B => idem
je suis C => je suis dans les cas 1,3,4 et 6
je suis D => aucun acces pour lui (il sera visible par les autres selon les cas)
les utilisateurs de type D n'apparaissent jamais dans les dossiers, sauf dans les cas où ils sont considérés autrement (A,B ou C).
ex. je me connecte en tant que type C je dois avoir les liste des dossiers ou je suis présent (les cas 1,3,4 et 6).
j'espère que vous avez suivi le principe.
la difficulté est de trouver une requete en prenant compte des différents cas.
avec les requetes plus haut, j'affiche seulement le cas 1 et pas les autres notamment le 3.
voici un exemple type :
ex. afficher mes dossiers (id_user) ou mon type est C et D si A est absent
ainsi on affichera les cas 1,3,4 et 6.
Merci ces précieuses infos.
Code : Tout sélectionner
CREATE TABLE dossiers (
id_dossier varchar(20) NOT NULL default '',
nom_dossier varchar(90) NOT NULL default '',
PRIMARY KEY (id_dossier)
) TYPE=MyISAM;
Code : Tout sélectionner
CREATE TABLE liaison_dossier (
id_user varchar(10) NOT NULL default '',
type_user char(3) NOT NULL default '',
id_dossier varchar(20) NOT NULL default '',
KEY id_dossier (id_dossier)
) TYPE=MyISAM;
Code : Tout sélectionner
CREATE TABLE users (
id_user varchar(10) NOT NULL default '',
nom_user varchar(60) NOT NULL default '',
PRIMARY KEY (id_user)
) TYPE=MyISAM;