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 :

Requete pour plusieurs tables


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par défaut Requete pour plusieurs tables
    Bonjour,

    Je dois exporter dans un tableau excel des donnees, lesquelles sont reparties dans 2 tables avec une colonne commune.

    Schematiquement les tables donnent ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TABLE1
     - ProviderID INT
     - UserID VARCHAR(20)
     - Name VARCHAR(30)
     - FirstName VARCHAR(30)
     
    TABLE2
     - UserID VARCHAR(20)
     - Date VARCHAR(20)
     - Data1 VARCHAR(50)
     - Data2 VARCHAR(50)
     - Data3 VARCHAR(50)
     - Data4 VARCHAR(50)
    Si par exemple TABLE1 contient:
    Pro1, User1, tintin, tintin2
    Pro1, User2, Henry, patrick
    Pro2, User3, Thierry, michel

    Et TABLE2 contient:
    User1, 10/01/2010, data1, data2, data3, data4
    User2, 15/03/2009, d1,d2,d3,d4
    User3, 5/12/2005, d5,d8,d6,d4


    Je dois recuperer tous les users avec toutes leurs donnees pour chaque provider en sachant qu'un script php me fournit la liste de tous les ProviderID.
    N'ayant pas les connaissances d'un expert en MySql, je vais poser quelques questions pour resoudre mon probleme.
    1. Comment dois-je proceder pour que MySql me retourne ceci ?
    Je suppose qu'il faut que je fasse une requete pour chaque providerID fournie par PHP ?
    2. Mais dans cette requete comment puis-je faire pour recuperer les donnees de TABLE1 et de TABLE2,
    sachant que TABLE2 va dependre du UserID de TABLE1, mais que TABLE2 dois me retourner plusieurs reponses pour le meme UserID ?
    Est-il possible de faire cela dans une seule requete ?

    Par exemple, voici les resultat que je devrais obtenir:
    Pour Pro1, MySql me retourne:
    -Pro1, User1, Tintin, tintin2, 10/01/2010, data1,data2,data3,data4
    -Pro1, User2, Henry, patrick, 15/03/2009, d1,d2,d3,d4

    Pour Pro2MySql me retourne:
    -Pro2, Thierry, michel, 5/12/2005, d5,d8,d6,d4



    3. Et ensuite si j'ai 500 providers, et que chaque Provider a 10000 users par exemple, je pense que cela va representer de grosses donnees a gerer et les requetes risques d'etre tres longues a s'executer et peut-etre augmenter l'utilisation du CPU.
    Comment ce genre de situation peut-elle se gerer ? Faut-il faire plusieurs scripts PHP ? Comment procederiez-vous ?

    Merci d'avance
    Fred

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 13
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.providerid, b.userid, a.firstname, a.name, b.date, b.data1, b.data2. b.data3. b.data4
      from table1 a, table2 b
     where a.userid = b.userid
    Tu obtiendras tous les userid de TOUS les providers dans une seule requete. Bien sur, si tu recoit une liste de providers d'un script PHP, tu peut filter en ajoutant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and providerid in (1,4,7,10...)
    Note : Une colonne nommé "date", bien que possible avec MySQL, te causera bien des soucis dans le futur. "date" est un mot réservé.

    Pas d'inquiètudes pour les volumes. Si tu as les indexes nécessaires le volume n'a pas beaucoup d'importances.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Concernant la question 3.
    Pour optimiser la performance de la requête, tout d'abord il faut indexer certaines colonnes.

    En premier lieu, le champ UserId de la TABLE2 semble unique si tel est le cas, il faudrait que ce champ soit la clé primaire de la table. Faisable avec un ALTER TABLE ... ADD PRIMARY KEY ...
    Ensuite, pour optimiser l'accès à TABLE avec des critères sur UserId, il faut créer un index.

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par défaut
    Merci pour vos reponses.
    J'ai essaye, et ca marche, mais si dans la TABLE2 j'ai plusieurs lignes pour le meme userID, cela va me donner ceci:

    -Pro1, User1, Tintin, tintin2, 10/01/2010, data1,data2,data3,data4
    -Pro1, User1, Tintin, tintin2, ici l'autre ligne de TABLE 2
    -Pro1, User1, Tintin, tintin2, ici l'autre ligne de TABLE 2
    -Pro2, Thierry, michel, 5/12/2005, d5,d8,d6,d4

    Ce qui va me generer des lignes supplementaires. Je risque de me retrouver avec des milliers de ligne a traiter, non ?

    Mais est-il possible d'avoir les autres lignes de TABLE2 pour le meme userID dans la meme ligne de resultat de la requete, comme cela:

    -Pro1, User1, Tintin, tintin2, 10/01/2010, data1,data2,data3,data4, ici les autres lignes de TABLE 2 en fonction de userID
    -Pro2, Thierry, michel, 5/12/2005, d5,d8,d6,d4

  5. #5
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Tout d'abord apprend à faire tes jointures avec la syntaxe normalisée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.providerid, b.userid, a.firstname, a.name, b.date, b.data1, b.data2, b.data3.,b.data4
    FROM table1 A
    INNER JOIN table2 b ON a.userid = b.userid
    voire USING userid puisque les colonnes sur lesquelles s'opère la jointure ont le même nom.
    Pour ton problème de regroupement sur une seule ligne, soit tu utilises GROUP_CONCAT, soit tu t'inspires de mon article afférent à l'émulation d'un tableau croisé dynamique, article dont le lien est dans ma signature.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FredericB Voir le message
    Mais est-il possible d'avoir les autres lignes de TABLE2 pour le meme userID dans la meme ligne de resultat de la requete, comme cela:

    -Pro1, User1, Tintin, tintin2, 10/01/2010, data1,data2,data3,data4, ici les autres lignes de TABLE 2 en fonction de userID
    -Pro2, Thierry, michel, 5/12/2005, d5,d8,d6,d4
    Le nombre de colonnes d'une requête SQL est fixe. Dans ta demande, tu ne sais pas a priori dire combien ton résultat contiendra de colonnes.
    Donc: non ce n'est pas possible en SQL "simple".

    En revanche, dans un programme on pourrait imaginer (mais ça risque d'être un peu touchy) de
    - déterminer a priori le nombre de colonnes,
    - construire dynamiquement la requête SQL correspondante
    - lire les données retournées en ayant conscience du nombre de colonnes dans le résultat.

  7. #7
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par Nudger Voir le message
    Le nombre de colonnes d'une requête SQL est fixe. Dans ta demande, tu ne sais pas a priori dire combien ton résultat contiendra de colonnes.
    Donc: non ce n'est pas possible en SQL "simple".

    En revanche, dans un programme on pourrait imaginer (mais ça risque d'être un peu touchy) de
    - déterminer a priori le nombre de colonnes,
    - construire dynamiquement la requête SQL correspondante
    - lire les données retournées en ayant conscience du nombre de colonnes dans le résultat.
    C'est précisément ce qui est exposé dans mon article Comment émuler un tableau croisé [quasi] dynamique dans le lien ci-dessous.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

Discussions similaires

  1. Aide pour requete dans plusieurs table
    Par rip2k dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/05/2012, 16h13
  2. Requete pour comparer tables sur 2 schemas
    Par Kannuki dans le forum Oracle
    Réponses: 28
    Dernier message: 09/02/2006, 14h40
  3. requete sur plusieurs tables
    Par manaboko dans le forum Requêtes
    Réponses: 6
    Dernier message: 13/12/2005, 17h07
  4. [ Design ] commentaires pour plusieurs tables
    Par Celelibi dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 31/10/2005, 18h08
  5. [Débutant] requete entre plusieurs tables
    Par xufux dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/08/2005, 14h00

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