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 :

Limite des fonctionnalités MySQL pour le compte des résultats


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 92
    Points : 116
    Points
    116
    Par défaut Limite des fonctionnalités MySQL pour le compte des résultats
    Hello,

    Je me casse la tête depuis un bon moment sur une (grosse) requête MySQL.

    La requête:
    Imaginez une requête multitables du type...
    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
     
    SELECT user, data_type, file_name, date_time
    FROM (
    (SELECT a.user, b.data_type, c.file_name, d.date_time 
    FROM user_datas a
    LEFT JOIN generic_data b
    ON a.user = b.user
    LEFT JOIN stack c
    ON a.user = c.user
    LEFT JOIN timeframe d
    ON a.user = d.user)
    UNION ALL
    (SELECT a.user, b.data_type, c.file_name, d.date_time 
    FROM user_revoked a
    LEFT JOIN generic_data b
    ON a.user = b.user
    LEFT JOIN stack c
    ON a.user = c.user
    LEFT JOIN timeframe d
    ON a.user = d.user)
    UNION ALL
    (SELECT a.user, b.data_type, c.file_name, d.date_time 
    FROM user_latent a
    LEFT JOIN generic_data b
    ON a.user = b.user
    LEFT JOIN stack c
    ON a.user = c.user
    LEFT JOIN timeframe d
    ON a.user = d.user)
    ORDER BY date_time DESC
    Le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     ___user________data_type___________file_name__________date_time________
    | pablo001       image                photo.jpg          2012-02-01 12:55:01
    | pablo001       text                  vars.pdf            2012-02-01 12:22:20
    | pablo001       signin               NULL                 2012-02-01 10:01:33
    | cindy            text                  toto.pdf            2012-01-28 23:25:23
    | antony          text                 comme.pdf         2012-01-28 22:24:52
    | antony          signin               NULL                 2012-01-28 22:16:21
    | pablo001       register             NULL                 2012-01-28 10:17:42
    | antony          register            NULL                  2012-01-27 08:52:25
    | cindy            image               DN003.png          2012-01-27 08:44:45
    | cindy            register             NULL                 2012-01-27 07:32:34
    -------------------------------------------------------------------
    L'affichage:
    Par ordre de temps, décroissant...
    pablo001 a ajouté un image, un fichier de texte et s'est connecté
    cindy a ajouté un fichier de texte
    antony a ajouté un fichier de texte et s'est connecté
    pablo001 s'est inscrit
    antony s'est inscrit
    cindy a ajouté une image et s'est inscrite
    Sachant qu'une même user peut apparaître dans plusieurs table de type a, et que les résultats se suivants seront concaténés avant de passer à l'utilisateur suivant, comment feriez-vous pour déterminer la variable LIMIT des résultats à afficher?

    Merci à vous!

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    pablo001 a ajouté un image, un fichier de texte et s'est connecté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY date_time DESC
    Pourquoi trier par date_time descendant ?
    Je dirais plutôt que pablo001 s'est connecté, a ajouté un fichier de texte puis une image !

    Sachant qu'une même user peut apparaître dans plusieurs table de type a, et que les résultats se suivants seront concaténés avant de passer à l'utilisateur suivant, comment feriez-vous pour déterminer la variable LIMIT des résultats à afficher?
    Comment veux-tu qu'on réponde à ça ?
    On ne sait pas quel volume de données est à traiter ni à quel rythme les données sont insérées ni quelle est la capacité et le mode d'affichage du résultat, quelles contraitnes ergonomiques éventuelles tu as...

    Même si tu trouves une réponse adéquate aujourd'hui, peut-être que dans quelques temps, avec une augmentation du trafic de l'application, cette valeur sera à revoir.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 92
    Points : 116
    Points
    116
    Par défaut
    Hello Phil,

    Excellente réponse. Pour ce qui est de l'affichage, il s'agissait d'un exemple, mais dans mon script de récup, je mets effectivement les choses dans le bon ordre.

    Pour la limite des résultats, étant donné que le volume est inconnu mais comme la quantité d'utilisateurs différents peut être attribuée, est-ce que l'on pourrait limiter la requête à x utilisateurs différents ?

    Exemple:

    j'indique qu'il ne peut y avoir que 2 utilisateurs différents, du coup, notre résultat serait :

    pablo001 a ajouté un image, un fichier de texte et s'est connecté
    cindy a ajouté un fichier de texte
    ou, si pablo001 a ajouté 15 images et cindy ajouté 3 fichiers :

    pablo001 a ajouté 15 images, un fichier de texte et s'est connecté
    cindy a ajouté 3 fichiers de texte
    Ce qui reviendrait à limiter le nombre d'utilisateurs différents sans prendre en compte le volume.

    Merci beaucoup pour ton aide précieuse, à chaque fois!

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Problème intéressant !

    Essaie de voir si tu peux faire ce genre de requête pour récupérer les deux derniers utilisateurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT user
    FROM timeframe
    ORDER BY date_time DESC
    LIMIT 2
    Si tu récupères bien les deux derniers utilisateurs et non pas les deux dernières lignes de timeframe, tu dois pouvoir faire une jointure de cette petite requête avec ta grosse requête UNION pour récupérer toutes les informations de ces deux derniers utilisateurs.

    Si cette petite requête ne fonctionne pas, essaie celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT user
    FROM 
    (
    	SELECT user, date_time
    	FROM timeframe
    	ORDER BY date_time DESC
    ) tmp
    LIMIT 2

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 92
    Points : 116
    Points
    116
    Par défaut
    Hello Phil,

    Alors j'ai bien testé ta requête et elle retourne bien les 2 derniers utilisateurs. Merci! Maintenant, le souci c'est que si j'effectue un DISTINCT avant les UNIONS, et bien les résultats se résume à un GROUP BY des informations de la colonne "user".

    Exemple de résultats affichés:

    |___user___|
    |_pablo001_|
    |__cindy___|
    au lieu de :

    |___user___|
    |_pablo001_|
    |_pablo001_|
    |_pablo001_|
    |__cindy___|
    L'ultime possibilité serait d'effectué un count des informations mais comme le but de la requête pour un image, par exemple, est de récupérer le nom de l'image afin de l'afficher, ça va pas...

    Quelle hiérarchie utiliserais-tu? Et à quelle jointure pensais-tu?

    Merci beaucoup!

    ps: je t'envoie un sample en pm si tu souhaites regarder un peu comment ça fonctionne!

  6. #6
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    J'ai dit qu'il fallait faire une jointure de la petite requête avec ta grosse requête UNION.
    Un truc de ce genre :
    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
    SELECT user, data_type, file_name, date_time
    FROM 
    (
    	SELECT a.user, b.data_type, c.file_name, d.date_time 
    	FROM user_datas a
    	LEFT JOIN generic_data b ON a.user = b.user
    	LEFT JOIN stack c ON a.user = c.user
    	LEFT JOIN timeframe d ON a.user = d.user
    	UNION ALL
    	SELECT a.user, b.data_type, c.file_name, d.date_time 
    	FROM user_revoked a
    	LEFT JOIN generic_data b ON a.user = b.user
    	LEFT JOIN stack c ON a.user = c.user
    	LEFT JOIN timeframe d ON a.user = d.user
    	UNION ALL
    	SELECT a.user, b.data_type, c.file_name, d.date_time 
    	FROM user_latent a
    	LEFT JOIN generic_data b ON a.user = b.user	
    	LEFT JOIN stack c ON a.user = c.user
    	LEFT JOIN timeframe d ON a.user = d.user
    ) t1
    INNER JOIN
    (
    	SELECT DISTINCT user
    	FROM timeframe
    	ORDER BY date_time DESC
    	LIMIT 2
    ) t2 ON t2.user = t1.user
    ORDER BY date_time DESC

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    Sinon en passant je ne comprend pas bien l'utilité de faire n fois les jointures sur les tables : generic_data, timeframe, stack.

    Vu que les jointures avec les tables user_datas, user_revoked et user_latent ne se font que sur "user".

  8. #8
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Oui ça m'a titillé l'esprit aussi mais je ne me suis pas penché sur la question, sauf pour faire ma petite requête qui n'avait finalement besoin que d'une seule table.

    La requête globale est probablement simplifiable.

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 92
    Points : 116
    Points
    116
    Par défaut
    Hello,

    En fait, cette requête est juste un exemple, mais pour présenter mon problème, je devais "fixer" le LEFT JOIN sur quelque chose... En l'occurence "user".

    Je vais essayer avec le INNER JOIN et je reviens vers vous.

    Merci!

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    quelle est la structure de vos tables ?

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 92
    Points : 116
    Points
    116
    Par défaut
    Envoyée par mp ^^

    Prodigieux ce INNER JOIN, ça fonctionne ^^ Mais la requête est très lourde, non? En vous basant sur le fichier que je vous ai envoyé, que feriez-vous pour l'optimiser?

    On va y arriver

    Encore merci!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/07/2013, 16h09
  2. Réponses: 16
    Dernier message: 08/04/2013, 23h41
  3. [MySQL] installation des tables mysql pour CMS
    Par gtraxx dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 29/09/2010, 17h36
  4. Réponses: 3
    Dernier message: 04/01/2007, 18h42
  5. [Date dans Mysql] Prise en compte des espaces
    Par tchoukapi dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 02/01/2006, 04h41

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