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 :

Left outer join sur Select multitable


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 64
    Par défaut Left outer join sur Select multitable
    Bonjour,

    Je sèche sur un petit problème qui doit être resolvable proprement.

    J'ai :
    - une table contenant un Id et un Nom appelée Agents
    - une table contenant un Id, un Nom, un Taux appelée Produits
    - une table contenant un Id, un Id_agent, un Id_produit, un taux appelée Taux

    Voici un exemple de la base de données :
    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
     
    --
    -- Structure de la table `agents`
    --
     
    CREATE TABLE IF NOT EXISTS `agents` (
      `id` int(11) NOT NULL auto_increment,
      `nom` varchar(25) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    --
    -- Contenu de la table `agents`
    --
     
    INSERT INTO `agents` (`id`, `nom`) VALUES
    (1, 'Agent 1'),
    (2, 'Agent 2');
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `produits`
    --
     
    CREATE TABLE IF NOT EXISTS `produits` (
      `id` int(11) NOT NULL auto_increment,
      `nom` varchar(25) NOT NULL,
      `taux` float NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    --
    -- Contenu de la table `produits`
    --
     
    INSERT INTO `produits` (`id`, `nom`, `taux`) VALUES
    (1, 'Produit 1', 5),
    (2, 'Produit 2', 10);
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `taux`
    --
     
    CREATE TABLE IF NOT EXISTS `taux` (
      `id` int(11) NOT NULL auto_increment,
      `id_agent` int(11) NOT NULL,
      `id_produit` int(11) NOT NULL,
      `taux` float NOT NULL,
      PRIMARY KEY  (`id`),
      KEY `id_agent` (`id_agent`,`id_produit`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    --
    -- Contenu de la table `taux`
    --
     
    INSERT INTO `taux` (`id`, `id_agent`, `id_produit`, `taux`) VALUES
    (1, 2, 2, 60),
    (2, 1, 2, 50);
    Je voudrai une vue qui m'affiche tous les agents et produits avec leurs taux correspondant soit au taux de la table Taux, sinon au taux de la table produits.

    J'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
    	COALESCE(taux.id, 0) AS id,
    	agents.id AS id_agent,
    	produits.id AS id_produit,
    	COALESCE(taux.taux, produits.taux) AS taux
    FROM agents, produits
    LEFT OUTER JOIN taux ON taux.id_agent = agents.id AND taux.id_produit = produits.id
    Je voudrai donc que cette vue affiche :
    id --- id_agent --- id_produit --- taux
    0 ------- 1 ---------- 1 --------- 5
    2 ------- 1 ---------- 2 --------- 50
    1 ------- 2 ---------- 2 --------- 60
    0 ------- 2 ---------- 2 --------- 10

    Seulement cette vue ne fonctionne pas simplement parce que le LEFT OUTER JOIN ne se fais que sur produits.

    D'après vous, serait il possible d'eviter quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT
    	COALESCE((SELECT id FROM taux WHERE taux.id_agent = agents.id AND taux.id_produit = produits.id), 0) AS id
    	agents.id AS id_agent,
    	produits.id AS id_produit,
    	COALESCE((SELECT taux FROM taux WHERE taux.id_agent = agents.id AND taux.id_produit = produits.id), produits.taux) AS taux
    FROM agents, produits
    Merci d'avance pour toute réponse.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 64
    Par défaut
    Bon ben il suffisait de poser la question...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT
    	COALESCE(taux.id, 0) AS id,
    	agents.id AS id_agent,
    	produits.id AS id_produit,
    	COALESCE(taux.taux, produits.taux) AS taux
    FROM agents
    CROSS JOIN produits
    LEFT OUTER JOIN taux ON taux.id_agent = agents.id AND taux.id_produit = produits.id

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

Discussions similaires

  1. Left outer join sur table temporaire
    Par shafomat dans le forum SQL
    Réponses: 3
    Dernier message: 02/09/2011, 11h58
  2. LEFT OUTER JOIN refusé sur une colonne de formule
    Par madina dans le forum Reports
    Réponses: 20
    Dernier message: 20/07/2010, 13h46
  3. Utilisation d'un filtre directement sur 'LEFT OUTER JOIN'
    Par lodan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/03/2007, 17h17
  4. Réponses: 6
    Dernier message: 06/10/2006, 23h15
  5. [MSDE] SELECT et LEFT OUTER JOIN
    Par joefou dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/10/2006, 10h59

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