Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/09/2011, 17h12   #1
Nouveau Membre du Club
 
Inscription : mars 2011
Messages : 99
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 99
Points : 29
Points : 29
Par défaut Petit défi SQL

Salut,

Après des heures de prise de tête sur une requête je vous propose de m'éclairer sur cette dernière.
J'ai des petites lacune en SQL donc soyez sympas si ça vous parait simple

j'ai 3 tables :

Code :
1
2
3
objet {id, nom}
objet_identite {id, objet_id, identite_id, lecture, ecriture, modification}
identite {id, nom}
J'aimerais avoir dans mon résultat de requête un tableau contenant :
objet.id, objet.nom, objet_identite.lecture, objet_identite.ecriture, objet_identite.modification

La petite subtilité c'est que ma table objet_identite est null de base et se remplit en fonction des droits activés.

Pour exemple :
j'ai 3 objets (id = 1, objet = toto; id = 2, objet = titi; id = 3, objet = tutu)
et 3 identités (id = 1, nom = admin; id = 2, nom = compta; id = 3, nom = secret)
et j'ai activé tous les droits pour l’identité admin sur l'objet titi, j'ai donc dans la table objet_identite (id = 1, objet_id = 2, identite_id = 1, lecture = true, ecriture = true, suppression = true)

je voudrais en affichage si je suis sur l’identité admin :
LIGNE 1 :
objet.id = 1, objet.nom = toto, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false
LIGNE 2 :
objet.id = 2, objet.nom = titi, objet_identite.lecture = true, objet_identite.ecriture = true, objet_identite.modification = true
LIGNE 3 :
objet.id = 3, objet.nom = tutu, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false

et sur l’identité compta :
LIGNE 1 :
objet.id = 1, objet.nom = toto, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false
LIGNE 2 :
objet.id = 2, objet.nom = titi, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false
LIGNE 3 :
objet.id = 3, objet.nom = tutu, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false

Alors ma requête actuellement ressemble à ça :
Code :
1
2
3
4
5
SELECT o.id, o.nom, oi.lecture, oi.creation, oi.modification, oi.suppression
            FROM objet o
            LEFT JOIN objet_identite oi ON oi.objet_id = o.id
            WHERE oi.identite_id = $identiteId (variable selon l'identite choisi)
            OR oi.identite_id IS NULL
Ça fonctionne quand je suis en identite admin j'ai bien ce que je veux en revanche quand je suis en compta ou secret ma ligne titi n'est plus là (logique car maintenant elle existe).
J'ai essayé avec un différent de (<>) mais il compte pas les null du coup je l'ai dans l'os...

En espérant que ce soit clair j’attends vos réponse
davidbouv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 17h40   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 092
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 092
Points : 1 898
Points : 1 898
Bonjour,
Est-ce que ceci fonctionne:
Code SQL :
1
2
3
4
 
SELECT o.id, o.nom, ifnull(oi.lecture,false), ifnull(oi.creation,false), ifnull(oi.modification,false), ifnull(oi.suppression,false)
FROM objet o
LEFT OUTER JOIN objet_identite oi ON oi.objet_id = o.id AND oi.identite_id = $identiteId (variable selon l'identite choisi)

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 18h18   #3
Nouveau Membre du Club
 
Inscription : mars 2011
Messages : 99
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 99
Points : 29
Points : 29
Merci tatayo pour ton intérêt envers ce post mais malheureusement ta requête ne fonctionne pas non plus j'ai comme résultat mes 3 objets comme il faut avec les role compta et secret mais quand je suis en admin il me met des true sur le numéro de l'objet ou l'on choisi le role.
Donc dans ce cas là ça fonctionnerai mais je l'ai fait sur ma table de 160 objet avec l'objet numero 27 en true true true et l'identite numero 2 mais il m'affiche l'objet numero 2 true true true.

J'ai l'impression de pas être très clair quand j'explique désolé
davidbouv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 18h39   #4
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 092
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 092
Points : 1 898
Points : 1 898
Citation:
Envoyé par davidbouv Voir le message

J'ai l'impression de pas être très clair quand j'explique désolé
Disons que j'ai la vague impression de ne pas avoir tout compris...
Est-ce que tu peux être un peu plus explicite, en nous donnant pour chaque cas les paramètres utilisés, le résultat attendu et le resultat récupéré ?

D'après ton jeu de test, la requête suivante
Code SQL :
1
2
3
4
 
SELECT o.id, o.nom, ifnull(oi.lecture,false), ifnull(oi.creation,false), ifnull(oi.modification,false), ifnull(oi.suppression,false)
FROM objet o
LEFT OUTER JOIN objet_identite oi ON oi.objet_id = o.id AND oi.identite_id = 1

Doit te renvoyer ceci:
LIGNE 1 :
objet.id = 1, objet.nom = toto, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false
LIGNE 2 :
objet.id = 2, objet.nom = titi, objet_identite.lecture = true, objet_identite.ecriture = true, objet_identite.modification = true
LIGNE 3 :
objet.id = 3, objet.nom = tutu, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false

Est-ce le cas ?

tatayo.

P.S. j'ai pris IfNull(), mais selon la base il faut utiliser NVL, Coalesce..
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 09h38   #5
Nouveau Membre du Club
 
Inscription : mars 2011
Messages : 99
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 99
Points : 29
Points : 29
En fait ce n'est pas ce que je dois récupérer je vais essayer d'être plus clair :

En gros j'ai différentes identité pour chaque utilisateur donc comme dans mon exemple une 1 : ADMIN une 2 : COMPTA et une 3 : SECRET

je prends pour exemple ta requête :

Code :
1
2
3
SELECT o.id, o.nom, ifnull(oi.lecture,false), ifnull(oi.creation,false), ifnull(oi.modification,false), ifnull(oi.suppression,false)
FROM objet o
LEFT OUTER JOIN objet_identite oi ON oi.objet_id = o.id AND oi.identite_id = 1
Donc dans cette requête le oi.identite_id = 1 veut dire que l'on va faire des modifications de droit sur l'utilisateur qui a une identité ADMIN il faut donc que dans mon tableau j'aie la liste de tous les tuples dans la table objet et les droits rattachés à cet objet pour l'identité ADMIN.
La table objet_identite se construit au fur et à mesure que l'on met des droits en true sinon avant tous les droits n'existent pas.
Donc pour mon exemple il faudrait que cette requête me retourne (par rapport à l'exemple que j'ai donné au début :

LIGNE 1 :
objet.id = 1, objet.nom = toto, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false
LIGNE 2 :
objet.id = 2, objet.nom = titi, objet_identite.lecture = true, objet_identite.ecriture = true, objet_identite.modification = true
LIGNE 3 :
objet.id = 3, objet.nom = tutu, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false
en revanche si je passe sur l'identité COMPTA :

Code :
1
2
3
SELECT o.id, o.nom, ifnull(oi.lecture,false), ifnull(oi.creation,false), ifnull(oi.modification,false), ifnull(oi.suppression,false)
FROM objet o
LEFT OUTER JOIN objet_identite oi ON oi.objet_id = o.id AND oi.identite_id = 2
ça doit me retourner :

LIGNE 1 :
objet.id = 1, objet.nom = toto, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false
LIGNE 2 :
objet.id = 2, objet.nom = titi, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false
LIGNE 3 :
objet.id = 3, objet.nom = tutu, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false
car aucun droit pour l’identité COMPTA n'a été affecté.
/** Pas facile d'expliquer dis donc ^^ */
Je vais regarder ta requête de plus près mais il me semble que si je prends l'identité COMPTA ça me retourne aussi :

LIGNE 1 :
objet.id = 1, objet.nom = toto, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false
LIGNE 2 :
objet.id = 2, objet.nom = titi, objet_identite.lecture = true, objet_identite.ecriture = true, objet_identite.modification = true
LIGNE 3 :
objet.id = 3, objet.nom = tutu, objet_identite.lecture = false, objet_identite.ecriture = false, objet_identite.modification = false
davidbouv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 09h47   #6
Nouveau Membre du Club
 
Inscription : mars 2011
Messages : 99
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 99
Points : 29
Points : 29
Arg donc je viens de tester ta requête et là ça me donne bien ce que je veux !!
Alors que hier non, bizarre... J'ai du mal recopier...

Citation:
P.S. j'ai pris IfNull(), mais selon la base il faut utiliser NVL, Coalesce..
Je connais pas du tout je vais me renseigner.

En tous cas un grand MERCIIII !!
davidbouv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 09h57   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Citation:
P.S. j'ai pris IfNull(), mais selon la base il faut utiliser NVL, Coalesce..
Puisqu'on est dans le forum "Langage SQL" qui est indépendant des SGBD utilisés et donc plutôt consacré au SQL normatif, l'opérateur normatif qui devrait être présent dans tous les SGBD est COALESCE. Celui-ci permet de retourner le premier de ses arguments qui n'est pas NULL.

Code :
COALESCE(NULL, 0) -- résultat = 0
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 10h35   #8
Nouveau Membre du Club
 
Inscription : mars 2011
Messages : 99
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 99
Points : 29
Points : 29
Ok merci pour l'info c'est impeccable en SQL en revanche j'utilise doctrine du coup je dois transformer cette requête en DQL et là problème je ne peux pas rajouter de "ON" dans ma jointure et je ne peut pas rajouter de variable dans mes annotations de l'objet objet_identite

Code :
1
2
3
4
/**
    * @orm\ManyToOne(targetEntity="Objet", inversedBy="objet_identite")
    * @orm\JoinColumn(name="objet_id", referencedColumnName="id")
    */
j'ai pas fini d'en baver avec cette requête !!
davidbouv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 13h08   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par davidbouv Voir le message
c'est impeccable en SQL en revanche j'utilise doctrine du coup je dois transformer cette requête en DQL et là problème
Ah ces saloperies d'ORM !

J'avais essayé de jouer un peu avec Hibernate et j'avais vite compris qu'il était plus simple d'écrire les requêtes soi-même en SQL et de les balancer tel quel au serveur dans le programme.

Ne connaissant pas Doctrine, je ne peux pas t'aider mais je suppose que c'est le même genre d'usine à gaz !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h35   #10
Nouveau Membre du Club
 
Inscription : mars 2011
Messages : 99
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 99
Points : 29
Points : 29
Rahh j'en peux plus 1 jour et demi que je me prends la tête sur cette requête et je n'ai toujours pas trouvé enfin si mais maintenant c'est le DQL qui commence à me sortir par les yeux !!
davidbouv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 17h06   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
N'y a t-il pas une instruction sous Doctrine qui permet de lancer une requête écrite en SQL natif ?

J'ai pu le faire :
- avec Hibernate en Java ;
- avec Zend Framework en PHP ;
- avec PDO en PHP.

Si Doctrine utilise PDO, ça doit être faisable de faire une requête préparée en SQL avec des paramètres puis de faire exécuter la requête en lui filant les valeurs à affecter aux paramètres.
Ne t'embête pas avec la syntaxe saucissonnée du pseudo-SQL de l'ORM.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 09h44   #12
Nouveau Membre du Club
 
Inscription : mars 2011
Messages : 99
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 99
Points : 29
Points : 29
Oui c'est ce que j'ai fait mais j'ai eu des petits soucis de syntaxe d’ailleurs je pense que c'est quelque chose de mal conçu au niveau de doctrine mais le sujet est dans Symfony2>Doctrine2.
En tous cas ça y est tous fonctionne parfaitement !
davidbouv est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h25.


 
 
 
 
Partenaires

Hébergement Web