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 :

Affichage & Optimisation d'une colonne


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 70
    Points : 49
    Points
    49
    Par défaut Affichage & Optimisation d'une colonne
    Bonjour,

    J'utilise:
    Toad for MySQL v.4.1.0.220
    MySQL v.5.1

    Tout d'abord il est plus simple de présenter ma question avec un exemple.
    Ci-dessous de quoi alimenter des choses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    CREATE TABLE zz_operator ( 
        operator_id  	int(4) NOT NULL,
        operator_name	varchar(64) NOT NULL,
        PRIMARY KEY(operator_id)
    );
    CREATE TABLE zz_billing ( 
        client_id  	int(10) NOT NULL,
        compte_id    	varchar(16) NOT NULL,
        product_id    	varchar(16) NOT NULL,
        product_name  	varchar(128) NOT NULL,
        price         	int(5) NOT NULL,
        billing_date  	datetime NOT NULL,
        operator_id   	int(4) NOT NULL,
        broadcaster_id	varchar(8) NOT NULL,
        PRIMARY KEY(client_id,compte_id,billing_date,product_id)
    );
    CREATE TABLE zz_broadcaster ( 
        broadcaster_id  	char(8) NOT NULL,
        broadcaster_name	varchar(64) NOT NULL,
        PRIMARY KEY(broadcaster_id)
    );
    INSERT INTO zz_operator VALUES ('3','PARIS');
    INSERT INTO zz_operator VALUES ('12','ANGERS');
    INSERT INTO zz_operator VALUES ('15','LYON');
    INSERT INTO zz_operator VALUES ('16','LILLE');
    INSERT INTO zz_operator VALUES ('17','NICE');
    INSERT INTO zz_operator VALUES ('24','ORLEANS');
    INSERT INTO zz_broadcaster VALUES ('INT','INTERNET');
    INSERT INTO zz_broadcaster VALUES ('PRP','PROSPEC');
    INSERT INTO zz_broadcaster VALUES ('TEL','TELEPHONE');
    INSERT INTO zz_broadcaster VALUES ('BTQ','BOUTIQUE');
    INSERT INTO zz_broadcaster VALUES ('DRT','DIRECT');
    INSERT INTO zz_broadcaster VALUES ('EVT','EVENEMENT');
    INSERT INTO zz_billing VALUES ('053003','47410','DRT01351','LIT','399','20091101205716','3','DRT');
    INSERT INTO zz_billing VALUES ('053411','67308','INT39429','TABLE','399','20091030210749','12','INT');
    INSERT INTO zz_billing VALUES ('053411','67308','INT38721','CHAISE','499','20091031214001','12','INT');
    INSERT INTO zz_billing VALUES ('054420','10187','PRPP12922','STYLO','0','20091029055853','15','PRP');
    INSERT INTO zz_billing VALUES ('054420','10187','PRPP13039','CAHIER','0','20091029060050','15','PRP');
    INSERT INTO zz_billing VALUES ('054420','10187','PRPP13040','ECRAN','0','20091029064530','15','PRP');
    INSERT INTO zz_billing VALUES ('054420','10187','PRPP12992','SOURIS','0','20091030184130','15','PRP');
    INSERT INTO zz_billing VALUES ('054420','10187','PRPP12753','CLAVIER','0','20091101073241','15','PRP');
    INSERT INTO zz_billing VALUES ('054420','10187','PRPP12926','RAM','0','20091102180806','15','PRP');
    INSERT INTO zz_billing VALUES ('054778','84001','INT39551','CPU','399','20091030203632','3','INT');
    INSERT INTO zz_billing VALUES ('054787','86069','BTQ73002','CARNET','799','20091101205317','3','BTQ');
    INSERT INTO zz_billing VALUES ('054790','88379','INT38873','FEUILLE','499','20091101204457','3','INT');
    INSERT INTO zz_billing VALUES ('054790','88379','BTQ40768','CABLE','599','20091103014128','3','BTQ');
    INSERT INTO zz_billing VALUES ('054790','88379','TEL0502071803','TELEPHONE','399','20091103222405','3','TEL');
    INSERT INTO zz_billing VALUES ('054810','95184','PRPP12629','CLEF','0','20091030180650','3','PRP');
    INSERT INTO zz_billing VALUES ('054977','29288','EVT03306','SERRURE','499','20091102095958','15','EVT');
    INSERT INTO zz_billing VALUES ('055186','44143','INT36401','PORTE','399','20091103210321','3','INT');
    INSERT INTO zz_billing VALUES ('055464','08394','INT37865','ARMOIRE','499','20091029204543','3','INT');
    INSERT INTO zz_billing VALUES ('055602','34565','INT38886','LAVABO','399','20091101135720','17','INT');
    INSERT INTO zz_billing VALUES ('055623','44102','INT36395','PEIGNE','399','20091102160823','16','INT');
    J'ai dans la table zz_billing & zz_operator une colonne commune qui est operator_id

    Quand j'applique la requête ci-dessous j'obtiens la liste de tous mes champs et sur la colonne operator_id j'ai le n° de la ville correspondante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from zz_billing order by billing_date;
    Ce que j'aimerais au final, c'est avoir à la place du n°, la ville.

    J'ai réussi cela en faisant une jointure. Mais avec ça j'ai la jointure + la colonne d'origine. Pas forcément sexy.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from zz_billing as A, zz_operator as B where A.operator_id = B.operator_id order by B.operator_name;
    J'ai fais mieux avec un case. Ici la colonne est bien remplacé par ce que je désire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT client_id,compte_id,product_id,product_name,price,billing_date,
    			CASE operator_id 
    				WHEN "3" 		THEN "PARIS" 
    				WHEN "12" 	THEN "ANGERS" 
    				WHEN "15" 	THEN "LYON" 
    				WHEN "16" 	THEN "LILLE" 
    				WHEN "17" 	THEN "NICE" 
    				WHEN "24" 	THEN "ORLEANS" 
    				ELSE '' END operator_id,broadcaster_id 
    FROM zz_billing 
    WHERE billing_date >=current_date() - INTERVAL 1 WEEK 
    ORDER BY billing_date ASC;
    Ma question est simple.
    Pour arriver à ce même résultat, existe t-il une autre façon de faire? Plus simple & plus optimisé?

    Car le case est bien, mais j'ai du sélectionner chacune des colonnes alors qu'un "*" est forcément plus court puis le case peut vite devenir à rallonge dans certains cas.

    Merci d'avance.

  2. #2
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Bonsoir,

    De manière générale il ne faut pas utiliser SELECT * (sauf exception), il faut nommer les colonnes que l'ont veux voir apparaitre dans le résultat de la requête.

    La jointure que vous aviez faite était bonne, il suffit de sélectionner les colonnes que vous voulez dans le SELECT...

    Votre CASE est un peu idiot... la table zz_operator devient totalement inutile.
    Lorsque vous ajouterez une ligne dans cette table, vous devrez quand même modifier les CASE de toutes vos requêtes au niveau applicatif?

    Dans ce cas une simple jointure naturelle suffit:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT client_id,compte_id, product_id, product_name, price, billing_date,
           operator_name, broadcaster_id 
    FROM zz_billing
         NATURAL JOIN zz_operator
    WHERE billing_date >= CURRENT_DATE - INTERVAL 1 WEEK 
    ORDER BY billing_date ASC;

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 70
    Points : 49
    Points
    49
    Par défaut
    Parfait !

    Merci bien Oishiiii

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

Discussions similaires

  1. [XL-2010] Affichage graphique à partir d'une colonne dynamique
    Par rihab92 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/04/2015, 10h03
  2. affichage d'heure dans une colonne si l'heure existe
    Par abdourazak dans le forum Langage
    Réponses: 9
    Dernier message: 28/05/2014, 09h47
  3. Affichage du checkbox dans une colonne de jtable
    Par ulysse031 dans le forum Composants
    Réponses: 2
    Dernier message: 29/10/2010, 13h15
  4. [MySQL] Affichage et modification d'une colonne
    Par Lydie12 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/03/2008, 17h27
  5. listview, affichage du total d'une colonne
    Par zx10 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 04/12/2006, 16h58

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