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 :

Une requete sur 3 tables différentes. [Le retour]


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Points : 22
    Points
    22
    Par défaut Une requete sur 3 tables différentes. [Le retour]
    Bonjour à vous,

    Alors avant de vous poser mon probleme je vais vous expliquer la construction de ma base de donnée (enfin les tables concernées) :

    J'ai donc une table qui repertorie des objets achetables qui apparaissent dans une boutique d'objet informatique, voici le debut de sa construction

    table_store

    id,type, nom, prix, autres infos...

    J'ai une seconde table qui repertorie les objets achetés, la date d'achat et leur durée de vie ...

    table_matos

    id, id_store, autres infos...

    et j'ai une derniere table qui est représente "un pc" et qui stock dans chaque colone l'id d'un matos, qui correspond en faite à un de ses composant. (cm = Carte Mere, pr= Processeur ... c'est ce qui est dans la colonne type de table_store en faite)

    table_computer

    id, id_cm, id_pr, ainsi de suite

    Donc en gros ce que je voudrais faire c'est une requete qui récupere le nom de chaque objet en partant de TOUS les id_(abbréviation composant) et qui me recupere les infos de table_store (le nom par exemple)

    Je sais comment faire pour les recuperer un par un, mais pas comment faire pour qu'il le fasse avec toutes les colones de table_computer d'un coup.

    Pour recuperer le nom pour une colonne ca donne ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT table_store.nom FROM table_store, table_matos, table_computer WHERE id_cm=table_matos.id AND id_store = table_store.id
    Donc le probleme c'est qu'il faut que je refasse pour chaque colonne de table_computer, n'y a-t-il pas un moyen de faire qu'il le fasse pour toutes les colonnes que je veux automatiquement par exemple :

    SELECT table_store.nom FROM table_store, table_matos, table_computer WHERE id_cm,id_pr, id_...=table_matos.id AND id_store = table_store.id

    Si c'est possible, merci de m'éclairer.
    Sinon, je trouverais un autre moyen.

    Merci de m'avoir lu, en espérant avoir été assez clair et ne pas avoir fait trop de fautes d'orthographes

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Essaye:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT table_store.nom
     
    FROM table_computer
     
    INNER JOIN table_matos
    ON table_matos.id IN (id_cm, id_pr, ...)
     
    INNER JOIN table_store
    ON table_store.id=table_matos.id_store
    Ensuite est-ce que tu pourrais tester l'impact du IN sur les performances, Maximilian et moi, ça nous intéresse. (précise la version de MySQL)

    Sinon, question modélisation: imagine que je soi un fou furieux bourré de pognon et que j'ai envie de m'offrir un quadi-processeur (ou alors une société qui a besoin d'un très gros serveur), comment tu représentes ça dans ta base de données?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Points : 22
    Points
    22
    Par défaut
    Bon j'ai testé vite fait, ca marche nickel!

    Alors pour l'impact sur les performances, je vais voir ca! pour l'instant jsuis en phase de developpement donc ya pas beaucoup de requete sur la base, mais jvais faire un petit bench pour voir (mais la je vais me coucher), mais tu veux juste que je vois si le IN ralentit le serveur Mysql, ou que je le compare à un autre type de requete en repetant un grand nombre de fois la requete?

    Sinon la modélisation de l'ordinateur est "assez limitée", (j'essaye de faire un jeu en ligne ^^) et de ce fait il n'y a que les composants principaux
    • Carte Mere
    • Processeur
    • Disque Dur (2 max)
    • Carte Graphique
    • Memoire Vive (3 slots max)
    • Clavier
    • Souris
    • Carte Son
    • Modem
    • Lecteurn (2 baies max)
    • Sauvegarde
    • Boitier
    • Alimentation
    • Ecran
    • Ventilateur
    • Tuning (4 espaces max)


    Le but c'est d'avoir du choix, sans trop compliquer (pour le moment ^^)

    Enfin merci beaucoup pour ton aide, je met le tag resolu et repond moi pour que je te teste ca

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Ce qu'on cherche à déterminer, c'est si quand on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INNER JOIN matos
    ON matos.id IN (id_cm, id_pr, ...)
    MySQL tient compte des index ou pas.



    Si MySQL ne tient pas compte des index, alors la jointure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INNER JOIN matos
    ON (matos.id=id_cm OR matos.id=id_pr OR ...)
    sera beaucoup plus rapide.



    Quelqu'un a eu un pb similaire, qu'on a résolu en supprimant le IN au profit d'un OR (il n'y avait que 2 conditions, donc ça allait)

    Si t'as le temps de regarder ça, ça pourrait aider. Merci. (et bonne nuit )

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Points : 22
    Points
    22
    Par défaut
    Bon alors j'ai fais 4 bench :
    Il va chercher 21 nom différents, car il y a 21 colonne id_truc, dans la table computer.

    2 qui ont tourné en local sur une base Mysql en version : 5.0.18-nt
    Résultat avec le IN pour 100 000 requetes : 14.291s
    Résultat avec les OR pour 100 000 requetes : 14.519s

    Pas grand chose de flagrant environ 3 dixiemes de seconde

    Par contre sur mon serveur web (1000gp d'ovh) qui tourne sur une base Mysql en version : 4.0.17
    Résultat avec les IN pour 20 000 requetes : 1er test :9.784s, 2eme test : 9.819s, 3eme test :9.502s
    Résultat avec les OR pour 20 000 requetes : 1er test : 19.713s, 2eme test :15.621s, 3eme test :14.389s

    Donc en version 5, je dirais que la différence est quasi-nul, mais quand meme en faveur du IN, et qu'en version 4 l'avantage est nettement en faveur du IN.

    En esperant que cela puisse te servir.

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Merci, ça m'aide énormément (en plus on voulait comparer selon les versions).

    Le pire c'est que dans un autre sujet on a eu un comportement complètement contradictoire. J'en perd un peu mon latin...

    Encore une fois merci.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 32
    Points
    32
    Par défaut
    avec sql < 4.1
    la version
    INNER JOIN table
    ON table.id IN (a, b, ...)
    mets plus de temps que le ON ( ... OR ...)

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Merci pour cette précision clancy182.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Points : 22
    Points
    22
    Par défaut
    Bonsoir je rouvre ce post pour avoir une autre reponse à un probleme du meme genre.

    Donc je suis toujours avec les trois même tables qu'au dessus mais en faite voila ce que je veux faire :

    Donc je veux faire un UPDATE de table_matos, à partir des id stockés dans la table_computer.

    En gros voila ce que je voudrais qu'il fasse :

    UPDATE table_matos SET modif='1' WHERE table_matos.id = (table_computer.id_cg puis table_computer.id_pr puis table_computer.id_truc...
    En gros faire un UPDATE sur plusieurs lignes avec plusieurs conditions non? :p
    Donc que ca modifie les matos de ma table matos pour les id stocké dans mon entrée computer.

    Voila j'espere avoir été clair dans mes explications.

  10. #10
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par CritikKiller
    Voila j'espere avoir été clair dans mes explications.
    Pas trop non. C'est ça que tu veux faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE table_matos
     
    INNER JOIN table_computer
    ON table_matos.id IN (id_cm, id_pr, ...) 
     
    SET table_matos.modif='1' ;
    :

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Points : 22
    Points
    22
    Par défaut
    Ouep c'est parfait.

    J'essaye de faire au mieu, mais j'ai totalement changé de méthode de travail sur ma gestion des tables (j'avais 5 fois plus de requetes sur une ancienne version de mon projet) que j'ai encore du mal à bien expliquer et moi meme à bien comprendre ce que je fais.

    Je me renseigne sur l'utilisation de INNER JOIN, qui a l'air de devenir mon meilleur compagnon SQL !

    Merci encore!

  12. #12
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par CritikKiller
    Je me renseigne sur l'utilisation de INNER JOIN, qui a l'air de devenir mon meilleur compagnon SQL !
    Les jointures sont la base de l'algèbre relationnelle et donc du langage SQL.

    Un tuto à ce sujet :
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

    Bien sûr on peut faire des jointures dans des SELECT, mais aussi des UPDATE et des DELETE (voir les syntaxes correspondantes dans la doc)

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

Discussions similaires

  1. [debutant] creation d'une requete sur 3 table + group by !?
    Par christophebmx dans le forum Développement
    Réponses: 1
    Dernier message: 06/04/2008, 18h17
  2. [debutant] creation d'une requete sur 3 table + group by !?
    Par christophebmx dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/04/2008, 18h17
  3. [Conception] Affichage d'une requete sur plusieurs tables
    Par djinko dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/04/2007, 14h43
  4. Réponses: 4
    Dernier message: 23/10/2006, 09h09
  5. [vb6]faire une requete sur plusieurs tables
    Par Henry9 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/07/2006, 02h06

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