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 :

Remplacer une requête avec union avec une requête utilisant case


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Points : 94
    Points
    94
    Par défaut Remplacer une requête avec union avec une requête utilisant case
    Salut,

    J'ai une requête avec "union" et je me demande s'il y a un moyen de remplacer cette requête qui utiliserais "case then".
    La requête est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t1.field1 
    FROM table1 t1, matable m
    WHERE t1.id_matable = m.id
    UNION (
      SELECT t2.field2 
      FROM table2 t2, matable m
      WHERE t2.id_matable = m.id
    );
    Merci

  2. #2
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    1) Commence par apprendre la syntaxe en vigueur depuis 1992 pour les jointures.

    2) Les parenthèses autour de la seconde requête sont inutiles, UNION sert de séparateur naturel entre les deux requêtes.

    3) Les champs (fields) sont à la campagne ou dans les formulaires, pas dans les tables SQL qui sont composées de lignes et de colonnes.

    4) Ta requête fait l'union dans la même colonne de table1.field1 et de table2.field2 alors que CASE signifie que tu vas afficher X au cas où une condition est remplie, éventuellement Y au cas où une autre condition est remplie, éventuellement Z dans tous les autres cas.
    Ce n'est pas du tout la même chose que la requête UNION.

    Alors explique mieux ton besoin, de préférence avec des noms de tables et de colonnes réels au lieu d'utiliser des abstractions et en fournissant la structure des tables impliquées et un petit jeu de données ainsi que le résultat attendu. Ce sera ainsi plus facile de t'aider.
    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 !

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Pour avoir le même résultat je doute.

    Le problème étant que vous allez devoir passer par des left outer join et là deux problèmes se posent :
    - 1 ligne de "matable" est référencée à la fois dans "table1" et "table2" vous ne pourrez choisir qu'une seule des deux valeurs
    - 1 ligne de "matable" n'est référencée dans aucune des deux autres tables : vous allez devoir selectionner une valeur null.


    De plus niveau perf je ne pense pas que ce soit la panacée.


    Donc gardez votre UNION qui est fait pour le besoin que vous avez.

    edit : Ah CinePhil !

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Points : 94
    Points
    94
    Par défaut
    Merci beaucoup pour la réponse. Ca confirme que j'avais raison. Mon supérieur au travail m'a demandé de faire un case, moi non plus je ne voyais pas comment pour le besoin actuel.

    Merci encore une fois

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Points : 94
    Points
    94
    Par défaut
    je reformule ma question

    Je réécris la requête d'une autre manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT m.id,
               case t1.champ1
                   when null t2.champ2
                   else t1.champ1
               END AS monchamp
    FROM matable m
    LEFT JOIN table1 t1 on (t1.id_matable = m.id) 
    LEFT JOIN table1 t2 on (t2.id_matable = m.id)
    La condition de when null n'est jamais remplie même si j'ai des enregistrement avec null comme valeur de t1.champ1

    Le but étant d'afficher tous les enregistrement de table1 et table 2 qui sont relié à matable.

    Des suggestions?

  6. #6
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ton besoin est incompréhensible !

    Lis la phrase en bleu de ma signature et applique son principe !
    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 !

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Points : 94
    Points
    94
    Par défaut
    Merci pour le commentaire. Je poste la solution que j'ai trouvé ca sera peut être utile aux gens qui comprendraient la problématique même si je ne suis pas arrivé à la formuler clairement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT m.id,
               (case 
                   when is not null t2.champ2  then t2.champ2
                   else t1.champ1
               END) AS monchamp
    FROM matable m
    LEFT JOIN table1 t1 ON (t1.id_matable = m.id) 
    LEFT JOIN table1 t2 ON (t2.id_matable = m.id)

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Au passage, vous avez acheté un stocke de parenthèses ? Parce que dans cette nouvelles requêtes elle ne servent toujours à rien...

    Et c'est pas avec ça que vous allez comprendre ce que vous faites et quelle est la syntaxe du langage SQL....

    peut être auriez vous du suivre les cours !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    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 : 72
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par helpcomm Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT m.id,
               case 
                   when is not null t2.champ2  then t2.champ2
                   else t1.champ1
               END AS monchamp
    FROM matable m
    LEFT JOIN table1 t1 ON (t1.id_matable = m.id) 
    LEFT JOIN table1 t2 ON (t2.id_matable = m.id)
    Il convient de préciser que si, pour une ligne, t2.champ2 ET t1.champ1 sont tous les deux NULL, dans cette ligne la colonne monchamp retournera NULL.
    C'est peut-être le but recherché, mais il vrai qu'il a été, depuis le début de ce post, si mal formulé que, a minima, le doute est permis.
    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)

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Points : 94
    Points
    94
    Par défaut
    Effectivement c'est le but recherché. Et en effet, ca a été mal formulé.

    Merci pour votre compréhension et indulgence.

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

Discussions similaires

  1. Insertion d'une selection avec Union dans une table
    Par samgan dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 15/08/2011, 11h04
  2. Regrouper résultat requête dans while avec union
    Par gregWeb dans le forum Développement
    Réponses: 2
    Dernier message: 10/08/2011, 16h45
  3. [MySQL] Requête de recherche avec jointure dans une catégorie précise
    Par keusty78 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 23/10/2009, 21h01
  4. Réponses: 1
    Dernier message: 03/05/2009, 06h40
  5. Réponses: 9
    Dernier message: 05/04/2006, 17h48

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