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 :

Transformer plusieurs SELECT sur une table en une seule requête


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Points : 23
    Points
    23
    Par défaut Transformer plusieurs SELECT sur une table en une seule requête
    Bonjour à tous, et merci d'accorder un peu de votre temps à mon problème.

    Voilà, j'ai actuellement une requête qui marche parfaitement et qui fait ce que je lui demande ( j'extrais des topics d'un forum PHPBB pour les afficher sur une autre page ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT t.topic_title, t.topic_id, t.topic_first_poster_name, t.topic_time, t.topic_replies, t.topic_poster, t.topic_first_post_id, t.forum_id, p.post_text, u.topic_id AS publication
     
    FROM phpbb_topics t LEFT JOIN phpbb_posts p ON(t.topic_first_post_id=p.post_id) LEFT JOIN site_publications u ON(t.topic_id=u.topic_id)
     
    WHERE t.forum_id=4 OR t.forum_id=15 OR t.forum_id=16  ORDER BY t.topic_time DESC LIMIT 0,9
    La requête m'affiche bien les 10 derniers topics créés, qu'ils soient dans le forum 4 , 15 ou 16. Il m'en affiche 10 (limit 0,9).

    Jusque-là, aucun souci.

    Le problème étant que je voudrais sélectionner 10 topics du forum 4, 10 topics du forum 15 et 10 topics du forum 10 ( en clair 30 topics divisés sur 3 forums, soit 10 topics par forum).

    Evidemment, la solution bête et méchante et pas optimisée serait de faire 3 SELECT avec un WHERE : t.forum_id=numero du topic comme condition.


    Sauf que je me retrouverais avec 3 requêtes SQL, et je ne veux pas. Je voudrais pouvoir sélectionner les 10 derniers topics de chaque forum mais en une seule requête.

    J'ai regardé sur le forum, testé des UNIONS, essayé de voir avec des tables temporaires, mais au final je n'arrive à rien et je ne suis totalement perdu.

    Merci d'avance pour votre aide

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 031
    Points : 23 763
    Points
    23 763
    Par défaut
    Bonjour,

    Inspire-toi de l'exemple présenté dans les sources MySQL : http://mysql.developpez.com/telechar...aque-categorie

    Ça devrait correspondre à ce que tu recherches.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Merci, je regarde ça, je tente de comprendre et de créer un code, et je reviens

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 031
    Points : 23 763
    Points
    23 763
    Par défaut
    L'idée n'est pas de créer des catégories (qui sont un exemple dans le code source). Dans le cas présent, l'idée est de remplacer la notion de catégorie dans le requête du code source par la notion de forum dans ta requête.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Ok je vois, c'est un peu plus clair. Je bosse dessus là

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Bon ba en faite non , j'ai essayé plusieurs choses, mais il y'a quelque chose que je comprend pas : le SELECT COUNT() dans le WHERE, et le < n dans l'exemple. Je ne comprends pas l'utilité dans la requête ?

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 031
    Points : 23 763
    Points
    23 763
    Par défaut
    Je suppose que les identifiants de topics sont classés par ordre croissant de création des topics.
    Sans avoir testé, la requête suivante devrait s'approcher de ce que tu souhaites obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT t.topic_title, t.topic_id, t.topic_first_poster_name, t.topic_time, t.topic_replies, t.topic_poster, t.topic_first_post_id, t.forum_id, p.post_text, u.topic_id AS publication
    FROM phpbb_topics t 
    LEFT JOIN phpbb_posts p ON (t.topic_first_post_id=p.post_id) 
    LEFT JOIN site_publications u ON(t.topic_id=u.topic_id)
    WHERE t.forum_id IN (4, 15, 16)
    AND (
    	SELECT COUNT(*)
    	FROM phpbb_topics t1
    	WHERE t1.forum_id = t.forum_id
    	AND t1.topic_id > t.topic_id
    ) < 10
    ORDER BY t.topic_time
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Non je me retrouve avec tous les Topics de chaque forum. Donc une grosse quantité au lieu de 10 par forum.

    Je suis en train de faire des tests avec des BEETWEEN, je sais pas ce que ça va donner. Parce que j'ai beau chercher je comprend pas à quoi sert le SELECT COUNT dans l'exemple que tu m'as donné :/

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 031
    Points : 23 763
    Points
    23 763
    Par défaut
    Le SELECT COUNT permet, pour chaque topic, d'aller chercher le nombre de topics qui sont dans le même forum (d'où l'égalité sur les forum_id dans la sous-requête), mais avec un identifiant supérieur au topic.
    Et on limite le résultat aux topics qui ont moins de 10 topics qui leur sont postérieurs...

    C'est curieux que ça renvoie tous les topics d'un forum...
    On peut avoir un jeu d'essai ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Je n'ai rien dis, c'est moi qui doit merdé dans mon affichage, ça renvoie bien 30 résultats, 10 par forum ! J'ai vérifié avec php_my_admin.

    Je vais malgré tout me pencher sur cette histoire de COUNT histoire de bien saisir, parce qu'avoir le résultat c'est bien, mais le comprendre c'est mieux

    Merci encore, je vais noter le topic en résolu

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

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. Réponses: 1
    Dernier message: 19/10/2011, 12h13
  3. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  4. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  5. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50

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