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 :

Migration de mon cerveau "MSSQL" -> "Mysql" pour les jointures


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 2
    Par défaut Migration de mon cerveau "MSSQL" -> "Mysql" pour les jointures
    Bonjour,

    Je n'arrive pas à écrire, en MySQL, une requête que je saurai aisément écrire en T-SQL (MS SQL).

    Pour bien comprendre mon problème, voici un exemple :

    Trois table (mot, page et nuage) me servent à afficher un nuage de mot sur mes pages. Plusieurs mots pour une page, plusieurs utilisations de mots (sur différentes pages possibles).

    Table Mot :
    mot = mot1, valide = 1
    mot = mot2, valide = 1
    mot = mot3, valide = 0
    mot = mot4, valide = 1

    Table Page :
    page = page1, valide = 1
    page = page2, valide = 1
    page = page3, valide = 0
    page = page4, valide = 1

    Table Nuage :
    page = page1, mot = mot1, poids = 1, valide = 1
    page = page1, mot = mot2, poids = 2, valide = 1
    page = page1, mot = mot3, poids = 2, valide = 1
    page = page2, mot = mot1, poids = 2, valide = 1
    page = page2, mot = mot2, poids = 3, valide = 1
    page = page3, mot = mot1, poids = 3, valide = 1
    page = page3, mot = mot2, poids = 3, valide = 0

    Je veux afficher un tableau croisé comme celui-ci :

    mot1 mot2 mot4
    page1 poids=1 poids=2 poids=NULL
    page2 poids=2 poids=3 poids=NULL
    page4 poids=NULL poids=NULL poids=NULL

    page3 et mot3 étant non valide, ils ne doivent pas apparaitre !

    En T-SQL, j'aurai écrit (à peu près) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT page, mot, poids
    FROM nuage
    LEFT JOIN mot ON mot.m_id = nuage.n_m_id
    LEFT JOIN page ON page.p_id = nuage.n_p_id
    WHERE mot.valide = 1 AND page.valide = 1 AND nuage.valide = 1
    ou en remplacement du WHERE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ISNULL(mot.valide, 1) = 1 AND ISNULL(page.valide, 1) = 1 AND ISNULL(nuage.valide, 1) = 1
    Mais avec MySQL, impossible d'avoir cette jointure "totalement ouverte".

    Help me please

    NB : Le but est d'afficher un tableau permettant d'avoir TOUS les mots valides en tant que colonne, TOUTES les pages valides en tant que ligne et aux intersections, le poids associé (d'ou le besoin des NULL)

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut

    La requete que tu as écrite devrait fonctionner sous MySQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT page, mot, poids
    FROM nuage
    LEFT JOIN mot ON mot.m_id = nuage.n_m_id
    LEFT JOIN page ON page.p_id = nuage.n_p_id
    WHERE mot.valide = 1 AND page.valide = 1 AND nuage.valide = 1

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 2
    Par défaut
    Eh non, cela ne fonctionne pas ;-(
    Voici la base de test créée spécialement pour coller le plus possible à mon exemple.

    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
     
    -- 
    -- Structure de la table `mot`
    -- 
     
    CREATE TABLE `mot` (
      `m_id` int(10) unsigned NOT NULL auto_increment,
      `m_mot` varchar(50) NOT NULL,
      `m_bValide` tinyint(1) NOT NULL default '1',
      PRIMARY KEY  (`m_id`),
      KEY `m_bValide` (`m_bValide`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=30 ;
     
    -- 
    -- Contenu de la table `mot`
    -- 
     
    INSERT INTO `mot` (`m_id`, `m_mot`, `m_bValide`) VALUES 
    (29, 'mot4', 1),
    (28, 'mot3', 0),
    (27, 'mot2', 1),
    (26, 'mot1', 1);
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `nuage`
    -- 
     
    CREATE TABLE `nuage` (
      `n_id` int(10) unsigned NOT NULL auto_increment,
      `n_p_id` int(10) unsigned NOT NULL,
      `n_m_id` int(10) unsigned NOT NULL,
      `n_poids` tinyint(4) NOT NULL,
      `n_bValide` tinyint(1) NOT NULL default '1',
      PRIMARY KEY  (`n_id`),
      KEY `n_p_id` (`n_p_id`,`n_m_id`,`n_bValide`),
      KEY `n_bValide` (`n_bValide`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
     
    -- 
    -- Contenu de la table `nuage`
    -- 
     
    INSERT INTO `nuage` (`n_id`, `n_p_id`, `n_m_id`, `n_poids`, `n_bValide`) VALUES 
    (1, 1, 26, 1, 1),
    (2, 1, 27, 2, 1),
    (3, 1, 28, 2, 1),
    (4, 20, 26, 2, 1),
    (5, 20, 27, 3, 1),
    (6, 18, 26, 3, 1);
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `page`
    -- 
     
    CREATE TABLE `page` (
      `p_id` int(10) unsigned NOT NULL auto_increment,
      `p_libelle` varchar(100) NOT NULL,
      `p_bValide` tinyint(1) NOT NULL default '1',
      PRIMARY KEY  (`p_id`),
      KEY `p_bValide` (`p_bValide`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=106 ;
     
    -- 
    -- Contenu de la table `page`
    -- 
     
    INSERT INTO `page` (`p_id`, `p_libelle`, `p_bValide`) VALUES 
    (1, 'page1', 1),
    (20, 'page2', 1),
    (18, 'page3', 0),
    (105, 'page4', 1);
    La requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT p_libelle, m_mot, n_poids
    FROM nuage
    LEFT JOIN mot ON mot.m_id = nuage.n_m_id
    LEFT JOIN page ON page.p_id = nuage.n_p_id
    WHERE mot.m_bValide = 1 AND page.p_bValide = 1 AND nuage.n_bValide = 1
    me donne :
    p_libelle m_mot n_poids
    page1 mot1 1
    page1 mot2 2
    page2 mot1 2
    page2 mot2 3
    et moi je voudrai :

    p_libelle m_mot n_poids
    page1 mot1 1
    page1 mot2 2
    page1 mot4 NULL

    page2 mot1 2
    page2 mot2 3
    page2 mot4 NULL

    page4 mot1 NULL
    page4 mot2 NULL
    page4 mot4 NULL
    si 3 mots valides, on doit retrouver des "groupes" de 3 lignes par page
    si 3 pages valides, il doit y avoir 3 groupes de 3 mots

    Je ne sais pas si c'est très clair, mais bon, j'ai essayé de faire au mieux...

    NB : Je comprends bien que ce sont les conditions du WHERE qui me "bouffent" mes NULL, mais comment faire en sorte que ces conditions soient prises en compte 'LORSQUE' elles sont légitimes (si la valeur n'existe pas -NULL- on ne doit pas la tester).

    Merci d'avance !

  4. #4
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Parmis les solutions possibles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p_libelle, m_mot, n_poids
    FROM nuage
    LEFT JOIN mot ON mot.m_id = nuage.n_m_id
    LEFT JOIN page ON page.p_id = nuage.n_p_id
    WHERE IFNULL(mot.valide, 1) = 1 AND IFNULL(page.valide, 1) = 1 AND nuage.valide = 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p_libelle, m_mot, n_poids
    FROM nuage
    LEFT JOIN mot ON mot.m_id = nuage.n_m_id AND mot.m_bValide = 1
    LEFT JOIN page ON page.p_id = nuage.n_p_id AND page.p_bValide = 1
    WHERE nuage.n_bValide = 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p_libelle, m_mot, n_poids
    FROM nuage
    LEFT JOIN mot ON mot.m_id = nuage.n_m_id
    LEFT JOIN page ON page.p_id = nuage.n_p_id
    WHERE (mot.m_bValide IS NULL OR mot.m_bValide = 1)
      AND (page.p_bValide IS NULL OR page.p_bValide = 1)
      AND nuage.n_bValide = 1
    A noter que les "= 1" sont facultatifs (mais peut-être plus correctes).

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

Discussions similaires

  1. MySQL : quote identifiers
    Par Jasmine80 dans le forum Requêtes
    Réponses: 6
    Dernier message: 10/03/2008, 12h54
  2. Réponses: 2
    Dernier message: 07/08/2007, 21h41
  3. migration d'une base de mssql vers postgre sql
    Par dim_italia dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 06/08/2004, 22h56
  4. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06

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