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

Langage SQL Discussion :

[MySQL] Select sur plusieurs tables jointes


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    Par défaut [MySQL] Select sur plusieurs tables jointes
    J'ai :
    - une table principale "document" qui contient les colonnes : id, contenu
    * id est la clé primaire de la table

    - une table variables "variables" qui contient les colonnes : varid,valeur,tmplid,docid
    * varid est la clé primaire de la table
    * docid correspond à la clé de la table documents
    * tmplid correspond à la clé de la table template_variables

    - une table "template_variables" qui contient id, nom
    * id est la clé primaire de la table

    - une table "images" qui contient id,title,docid
    * docid correspond à la clé de la table "documents"
    * id est la clé primaire de la table

    A un "document" peut correspondre plusieurs "variables".
    Chaque variable à un nom dans la table "template_variables"

    A un document peut correspondre plusieurs "images".


    Je cherche la/les requêtes me permettant de sortir un document dés lors qu'il contienne "mot1" et/ou "mot2". Sachant que mot1 peut être dans la table "document", "variables" ou "images" et mot2 dans la table "images", "variables" ou "documents". Le tout en limitant la recherche aux variables de nom "var1,var2,var3"

    Est ce que quelqu'un aurait une idée ? Merci d'avance.

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Par défaut
    Bonsoir,

    Tu aurais un petit jeu d'essai, s'il te plait ?

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    Par défaut
    Voici pour mysql (utf8) le fichier sql de création des tables et 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
    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
    89
    90
    91
    92
    93
    94
    --
    -- Structure de la table `test_documents`
    --
     
    DROP TABLE IF EXISTS `test_documents`;
    CREATE TABLE IF NOT EXISTS `test_documents` (
      `id` int(10) NOT NULL auto_increment,
      `contenu` mediumtext,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;
     
    --
    -- Contenu de la table `test_documents`
    --
     
    INSERT INTO `test_documents` (`id`, `contenu`) VALUES
    (1, 'Voyage au pays du tsar'),
    (2, 'Solitudes du Gobi'),
    (3, 'Derrière la grande muraille');
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `test_images`
    --
     
    DROP TABLE IF EXISTS `test_images`;
    CREATE TABLE IF NOT EXISTS `test_images` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `nom` text NOT NULL,
      `docid` int(10) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
     
    --
    -- Contenu de la table `test_images`
    --
     
    INSERT INTO `test_images` (`id`, `nom`, `docid`) VALUES
    (1, 'Poupées Russes', 1),
    (2, 'vodka etrenelle', 1),
    (3, 'Souzdal', 2),
    (4, 'place rouge', 2),
    (5, 'Cité interdite', 3),
    (6, 'Armée de terre cuite', 3);
     
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `test_template_variables`
    --
     
    DROP TABLE IF EXISTS `test_template_variables`;
    CREATE TABLE IF NOT EXISTS `test_template_variables` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(50) NOT NULL default '',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
     
    --
    -- Contenu de la table `test_template_variables`
    --
     
    INSERT INTO `test_template_variables` (`id`, `name`) VALUES
    (1, 'motcle1'),
    (2, 'motcle2');
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `test_variables`
    --
     
    DROP TABLE IF EXISTS `test_variables`;
    CREATE TABLE IF NOT EXISTS `test_variables` (
      `id` int(11) NOT NULL auto_increment,
      `valeur` text,
      `tmplvarid` int(10) NOT NULL default '0',
      `docid` int(10) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
     
    --
    -- Contenu de la table `test_variables`
    --
     
    INSERT INTO `test_variables` (`id`, `valeur`, `tmplvarid`, `docid` ) VALUES
    (1, 'Russie', 1, 1),
    (2, 'Transsibérien', 2, 1),
    (3, 'Russie', 1, 2),
    (4, 'Lénine', 2, 2),
    (5, 'Chine', 1, 3),
    (6, 'Révolution culturelle', 2, 3);
    Exemple de recherche:
    tous les documents contenant "vodka" ET "Russie" sans tenir compte de la variable "motclé2". Sachant que ces mots peuvent être dans documents.contenu, variables.valeur, image.nom

    Merci pour ton aide.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    Par défaut
    Est ce qu'il manque des infos ou il n'y a pas de solution ?

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Est-ce qu'un truc dans le genre conviendrait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT d.contenu
    FROM test_documents d
    INNER JOIN test_variables v ON d.id = v.docid
    INNER JOIN test_images i ON d.id = i.docid
    WHERE v.valeur IN('russie', 'vodka') OR i.nom IN('russie', 'vodka')
    Je n'ai pas bien compris à quoi sert la table template_variables ; elle ne m'a pas servi dans la requête en tout cas.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    Par défaut
    une recherche de "vodka" ET "Russie" en excluant les variables de nom "motcle2" devrait donner comme seul résultat (vu de l'utilisateur)

    Contenu Valeur Nom
    Voyage au pays du tsar Russie vodka etrenelle


    Or ici en l'occurence la requete donne :

    Contenu Valeur Nom
    Voyage au pays du tsar Russie Poupées Russes
    Voyage au pays du tsar Russie vodka etrenelle
    Solitudes du Gobi Russie Souzdal
    Solitudes du Gobi Russie place rouge

    Or la valeur "Russie" associée au document "Solitudes du Gobi" est portée par une variable de nom "motcle2". Donc le doc aurait du être exclu.

    De plus on obtient 2 enregistrements pour le document 1.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    Par défaut
    Finalement je me demande si la bonne solution n'est pas :

    ======= Selection des documents associées aux variables différentes de motcle2 contenant "Russie" ou "vodka" et aux images contenant "Russie" ou "vodka" :
    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 DISTINCT d.contenu, nv.valeur,ni.nom  
    FROM test_documents d
    INNER JOIN (
    SELECT v.valeur, v.docid 
    FROM test_variables v
    INNER JOIN test_template_variables t ON t.id = v.tmplvarid
    WHERE t.name NOT IN('motcle2') AND (v.valeur IN('russie', 'vodka'))
    )
    AS nv ON nv.docid = d.id
    INNER JOIN (
    SELECT i.nom, i.docid
    FROM test_images i
    WHERE (i.nom LIKE '%russie%') OR  (i.nom LIKE '%vodka%')
    )
    AS ni ON ni.docid = d.id
    Ce qui donne :

    Voyage au pays du tsar Russie vodka etrenelle
    Cela me semble compliqué. Est ce que un expert peut me valider cette requête et me dire si elle peut être simplifiée ???

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    Par défaut
    Par contre je ne suis certain que la clause ET (Russie ET vodka) soit bien prise en compte. A mon avis le jeu de données n'est pas assez pertinent !

Discussions similaires

  1. Requête sur plusieurs Tables Jointes - Mysql 5.5
    Par jérix_kouame dans le forum Requêtes
    Réponses: 1
    Dernier message: 14/05/2012, 09h38
  2. [SQL Access] SELECT sur plusieurs Tables et Composer Champs
    Par Giuseppe dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 07/11/2005, 14h00
  3. SELECT sur plusieurs Tables et Composer Champs
    Par Giuseppe dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/11/2005, 12h27
  4. un seul SELECT sur plusieurs tables ?
    Par deloo dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/09/2005, 12h57
  5. select sur plusieurs table, question sur jointure
    Par Schulman dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/09/2004, 13h54

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