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 :

Pivot d'une table dynamiquement


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 18
    Par défaut Pivot d'une table dynamiquement
    Bonjour à vous,

    J'utilise la fonctionnalité 'pivot' pour afficher mes résultats, et j'aimerais pouvoir exécuter une requête dynamiquement, sans avoir à ajouter une ligne pour chaque nouvelle catégorie;

    Pensez-vous qu'il soit possible d'effectuer une sous-requête qui récupère toutes les catégories ? (donc de remplacer tout les "MAX(IF..." par un SELECT ?)

    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
     
    SELECT id_file,
    MAX(IF(label = 'categorie1', value, NULL)) AS categorie1,
    MAX(IF(label = 'categorie2', value, NULL)) AS categorie2,
    MAX(IF(label = 'categorie3', value, NULL)) AS categorie3,
    MAX(IF(label = 'categorie4', value, NULL)) AS categorie4,
    MAX(IF(label = 'categorie5', value, NULL)) AS categorie5,
    MAX(IF(label = 'categorie6', value, NULL)) AS categorie6,
    MAX(IF(label = 'categorie7', value, NULL)) AS categorie7,
    MAX(IF(label = 'categorie8', value, NULL)) AS categorie8
    FROM table1
    INNER JOIN table2 ON table1.categorie_id = table2.id_categorie
    INNER JOIN table3 ON table1.file_id = table3.id_file
    WHERE file_id IN (SELECT DISTINCT file_id FROM table1 WHERE value LIKE 'valeur')
    GROUP BY file_id
    Et peut-être que ma requete n'est pas très optimisée ?

    Je remercie d'avance pour votre aide !

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    Bonjour,

    un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT label, MAX(value)
    FROM maTableCategorie
    GROUP BY label;
    Suffit t'il ?

    Pourrait tu montrer la structure des tables s'il-te-plaît.

  3. #3
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 18
    Par défaut
    Salut,

    Tu voudrais que je remplace ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MAX(IF(label = 'categorie1', value, NULL)) AS categorie1,
    MAX(IF(label = 'categorie2', value, NULL)) AS categorie2,
    MAX(IF(label = 'categorie3', value, NULL)) AS categorie3,
    MAX(IF(label = 'categorie4', value, NULL)) AS categorie4,
    MAX(IF(label = 'categorie5', value, NULL)) AS categorie5,
    MAX(IF(label = 'categorie6', value, NULL)) AS categorie6,
    MAX(IF(label = 'categorie7', value, NULL)) AS categorie7,
    MAX(IF(label = 'categorie8', value, NULL)) AS categorie8
    par ta requete ?


    Et oui voici mes tables :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    --
    -- Structure de la table `file`
    --
     
    CREATE TABLE IF NOT EXISTS `file` (
      `id_file` int(11) NOT NULL AUTO_INCREMENT,
      `path` varchar(150) NOT NULL,
      PRIMARY KEY (`id_file`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
     
    --
    -- Contenu de la table `file`
    --
     
    INSERT INTO `file` (`id_file`, `path`) VALUES
    (1, '/data/a/b/c/d/e/g/aaaaaaaaaaaaa'),
    (2, '/data/a/b/c/d/e/g/bbbbbbbbbbbb'),
    (3, '/data/a/b/c/d/e/g/cccccccccccccc'),
    (4, '/data/a/b/c/d/e/g/ddddddddddddd');
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `metadata`
    --
     
    CREATE TABLE IF NOT EXISTS `metadata` (
      `id_metadata` int(11) NOT NULL AUTO_INCREMENT,
      `label` varchar(100) NOT NULL,
      PRIMARY KEY (`id_metadata`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
     
    --
    -- Contenu de la table `metadata`
    --
     
    INSERT INTO `metadata` (`id_metadata`, `label`) VALUES
    (1, 'Number of pictures'),
    (2, 'Date'),
    (3, 'Length'),
    (4, 'Video type'),
    (5, 'Size'),
    (6, 'Color'),
    (7, 'Frame rate');
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `metadata_value`
    --
     
    CREATE TABLE IF NOT EXISTS `metadata_value` (
      `file_id` int(11) NOT NULL,
      `meta_id` int(11) NOT NULL,
      `block_id` int(11) NOT NULL,
      `indexx` int(11) NOT NULL DEFAULT '0',
      `value` varchar(100) NOT NULL,
      FULLTEXT KEY `value` (`value`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
     
    --
    -- Contenu de la table `metadata_value`
    --
     
    INSERT INTO `metadata_value` (`file_id`, `meta_id`, `block_id`, `indexx`, `value`) VALUES
    (1, 5, 2, 1, '92'),
    (1, 6, 2, 1, '99'),
    (1, 7, 1, 1, '108'),
    (2, 6, 2, 0, 'Nissestien'),
    (3, 3, 1, 0, '0'),
    (3, 3, 2, 220, '12000'),
    (3, 3, 2, 710, '12011'),
    (3, 5, 4, 1, 'Ni'),
    (4, 5, 4, 0, 'test'),
    (4, 5, 4, 1, 'test2'),
    (4, 6, 4, 1, 'Nissestien 6777877'),
    (4, 3, 2, 710, '12010'),
    (4, 3, 2, 220, '12000'),
    (4, 3, 1, 0, '12010'),
    (3, 4, 10, 0, 'valx'),
    (3, 0, 1, 0, '0'),
    (3, 0, 1, 0, '0'),
    (3, 6, 1, 0, '0'),
    (3, 6, 1, 0, '0'),
    (3, 8, 2, 220, 'valz'),
    (3, 3, 1, 0, '0'),
    (3, 5, 2, 220, '50');
    Et voici ma requête qui fonctionne très bien, mais qui n'est pas automatique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT file_id,
    MAX(IF(label = 'Number of pictures', value, NULL)) AS number_of_pictures,
    MAX(IF(label = 'Date', value, NULL)) AS date,
    MAX(IF(label = 'Length', value, NULL)) AS lenght,
    MAX(IF(label = 'Video type', value, NULL)) AS video_type,
    MAX(IF(label = 'Size', value, NULL)) AS size,
    MAX(IF(label = 'Color', value, NULL)) AS color,
    MAX(IF(label = 'Frame rate', value, NULL)) AS frame_rate,
    FROM metadata_value MV
    INNER JOIN metadata M ON MV.meta_id = M.id_metadata
    INNER JOIN file F ON MV.file_id = F.id_file
    WHERE file_id IN (SELECT DISTINCT file_id FROM metadata_value WHERE value LIKE '%')
    GROUP BY file_id
    (Je fais ici un value LIKE '%' pour récuperer toutes mes valeurs)

    Merci pour ton aide,

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    La requête précédente que je t'ai passer ne te servira pas à grand chose en faite ^^,

    un lien qui pourra peut être t'aider sur ce que tu compte faire, ce que tu essaye de faire s'appel (comme tu l'a écrit dans le titre) un pivot sur les SGBDR il y'a le MOT CLÉ PIVOT qui permet de le faire seulement MySQL ne l'intègre pas à ma connaissance.

    EDIT : un autre lien en rapport avec le pivot

  5. #5
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 18
    Par défaut
    Super, merci pour ces liens !

    Et ouip en effet, pas de fonction PIVOT pour MySQL (je crois).

    J'ai trouvé une méthode bien qu'elle ne me plaise pas trop:
    http://buysql.com/mysql/14-how-to-au...ot-tables.html
    dès que je l'aurais adapté à ma requête je la posterais,

    Je suis ouvert a d'autres solutions !

    Merci,

Discussions similaires

  1. Problème de NULL sur un Pivot basé sur une Table Dynamique
    Par guilld dans le forum Développement
    Réponses: 3
    Dernier message: 01/08/2011, 15h05
  2. Créer une table dynamiquement
    Par Sam 069 dans le forum VBA Access
    Réponses: 3
    Dernier message: 11/10/2007, 20h36
  3. Réponses: 24
    Dernier message: 02/06/2006, 10h58
  4. Réponses: 5
    Dernier message: 25/07/2005, 14h03
  5. input ds une table dynamique
    Par mamouna dans le forum ASP
    Réponses: 32
    Dernier message: 30/06/2004, 18h12

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