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

Requêtes MySQL Discussion :

Requête conditionnelle en SQL


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut Requête conditionnelle en SQL
    Bonjour,

    J'ai une requête qui me semble complexe à écrire et j'aurais besoin de vos lumières.

    J'ai une liste de sociétés (table société) qui ont chacune un code postal (table codepostal) permettant de déterminer leur secteur (table secteur) qui lui-même permet de déterminer le commercial (table user) qui a en charge la société.
    A côté de ça, ma table société possède également une clé étrangère vers la table user (champ id_user) qui, si non nulle, va directement chercher le commercial associé à cet ID plutôt que celui déterminé par le secteur.

    C'est possible de faire ce genre de chose en SQL ?

    Dans le pire des cas je ferais une requête simple qui ramène aussi id_user et par programmation je relancerais deux groupes de requête (si null et si non null) mais j'ai peur que cela n'impacte trop les performances sachant que j'ai environ 25 000 sociétés à charger.

    Je vous remercie d'avance pour votre aide

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par julien.1486 Voir le message
    J'ai une liste de sociétés (table société) qui ont chacune un code postal (table codepostal) permettant de déterminer leur secteur (table secteur) qui lui-même permet de déterminer le commercial (table user) qui a en charge la société.
    A côté de ça, ma table société possède également une clé étrangère vers la table user (champ id_user) qui, si non nulle, va directement chercher le commercial associé à cet ID plutôt que celui déterminé par le secteur.
    Ce qui fait que, d'après votre modèle de données, il peut y avoir deux commerciaux différents pour la même société :
    - Celui du secteur où se trouve la société ;
    - Celui indiqué directement dans la table Societe.

    Est-ce vraiment ce que vous voulez modéliser ? Cela correspond-il à un cas réellement possible ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  3. #3
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Ce qui fait que, d'après votre modèle de données, il peut y avoir deux commerciaux différents pour la même société :
    - Celui du secteur où se trouve la société ;
    - Celui indiqué directement dans la table Societe.

    Est-ce vraiment ce que vous voulez modéliser ? Cela correspond-il à un cas réellement possible ?
    En réalité il n'y a qu'un commercial pour une même société :
    - Si société.id_user n'est pas nul, c'est celui-ci
    - Si société.id_user est nul, c'est celui du secteur

    Comment modéliser cela autrement ?

  4. #4
    Membre expérimenté
    Avatar de Tesing
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Par défaut
    En conservant ton modèle actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE user.id = IFNULL(societe.user_id, secteur.user_id)

    IFNULL retourne societe.user_id si societe.user_id ne vaut pas NULL, secteur.user_id sinon.

    EDIT : Erreur c'est pas ISNULL mais IFNULL

  5. #5
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Je ne pense pas que ce soit dans le WHERE qu'il faille intervenir mais dans le SELECT.
    Bien sûr, il faut avoir une jointure active entre les tables societe et secteur.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  6. #6
    Membre expérimenté
    Avatar de Tesing
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Saluton,
    Je ne pense pas que ce soit dans le WHERE qu'il faille intervenir mais dans le SELECT.
    Bien sûr, il faut avoir une jointure active entre les tables societe et secteur.
    Donc c'est au niveau de la sélection des colonnes des tables qu'on va trouver une solution

    Vous vouliez sans doute dire dans la clause FROM

    C'est quoi une jointure active ?

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par julien.1486 Voir le message
    En réalité il n'y a qu'un commercial pour une même société :
    - Si société.id_user n'est pas nul, c'est celui-ci
    - Si société.id_user est nul, c'est celui du secteur

    Comment modéliser cela autrement ?
    Votre modèle permet qu'il y en ait deux !

    Si dans la réalité, le commercial est toujours celui du secteur, il faut supprimer celui de la table Societe car il y a une dépendance directe de la société vers le commercial via le secteur où se trouve la société.

    Si par contre, comme vous semblez le dire, le commercial affecté à la société n'est pas forcément celui du secteur, vous pouvez utiliser les techniques données par FFFFFF-000000 et Maljuna Kris.

    Il pourrait aussi être mis en place un système, tel qu'un trigger, qui affecte automatiquement et par défaut le commercial du secteur à la création de la société si le commercial n'est pas indiqué dans le formulaire de création de la société.

    A moins que les règles de gestion prévoient qu'une société puisse ne pas avoir de commercial.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

Discussions similaires

  1. [WD17] Requête conditionnelle SQL via HyperFileSQL
    Par luludev dans le forum WinDev
    Réponses: 4
    Dernier message: 27/08/2014, 15h06
  2. requêtes "conditionnelles"
    Par _marabout dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 02/04/2006, 14h46
  3. Suppression avec sous-requête conditionnelle
    Par Magnus dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/10/2005, 10h39
  4. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20
  5. Requête modification base SQL
    Par jacma dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/11/2003, 13h49

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