IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Petit défi SQL


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 199
    Points : 12 775
    Points
    12 775
    Par défaut
    Bonjour,
    Est-ce que ceci fonctionne:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    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é

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 199
    Points : 12 775
    Points
    12 775
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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..

  5. #5
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    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...

    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 !!

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE(NULL, 0) -- résultat = 0
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  8. #8
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !!

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  10. #10
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    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 !!

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  12. #12
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petit défi SQL (Update avec condition)
    Par Angeldu74 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 03/03/2009, 12h55
  2. Petit défi de lettres
    Par tiboel dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 09/03/2006, 00h29
  3. Défi SQL - IB / FIB
    Par Régent dans le forum SQL
    Réponses: 3
    Dernier message: 21/10/2005, 16h47
  4. [W3C] Petit défi : Alignement et compatibilité IE et FF
    Par StreM dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 09/09/2005, 15h33
  5. Petit probleme sql
    Par maxxou dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/03/2005, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo