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 addition dans une requete


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Space Cowboy
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2005
    Messages
    496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2005
    Messages : 496
    Par défaut Une addition dans une requete
    Bonjour,

    J'aimerais savoir si il est possible de faire une addition dans une requete (...).
    J'aurais bien décrit ma table, mais je vais prendre un exemple plus parlant.

    J'ai un forum, dans ce forum il y a des topic avec des messages.
    Donc une table topic et une autre messages. Un topic comporte plusieurs message et on retrouve ces messages grace à un Id commun.

    J'aimerais en une seule requête, affiché tout les topics, et le nombre de messages qu'ils contiennent en début de page, mais aussi afficher les messages sous chacun des topics.


    Ce qui donnerait :

    Topic1 - 2 messages
    -> Message1
    -> Message2

    Topic3 - 1 messages
    -> Message1
    etc ...

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    Bonjour,
    prenons les tables suivantes :
    • topic ( id, titre )
    • message ( id, topicid )


    Pour sélectionner le nombre de messages par topic :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT topic.titre, count(*)
    FROM topic
      LEFT OUTER JOIN message ON topic.id=message.topicid
    GROUP BY topic.id

  3. #3
    Membre éclairé Avatar de Space Cowboy
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2005
    Messages
    496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2005
    Messages : 496
    Par défaut
    Marche pas :/, ou plutot à moitié.

    • A (id,numero,nom)
    • B (id, num_A, user, nbr1, nbr2, nbr3)


    J'aimerais les récupérer en les groupant par A. C'et à dire que je vait afficher ca :
    Nom numero 5 4 4
    + B user 1 2 3
    + B user 1 0 0
    + B user 3 2 1

    Nom numero 3 2 0
    + B user 2 2 0
    + B user 0 0 0
    + B user 1 0 0
    etc ... C'est possible en une seule requete ?

    Si non, je devrais faire la sélection de tout les numero en table A puis a chaque numéro, selectionner toute les entrées de B.

    Mais dans B, je peut faire l'addition de certain champ, et afficher ces champ ensuite, ou je susi obligé de faire deux requetes, une pour l'addition de tout les nbr1, nbr2, nbr3 et ensuite l'affichage ?

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    Pour faire la somme d'un champ, il faut utiliser la fonction SUM.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom, numero, SUM(nbr1), SUM(nbr2), SUM(nbr3)
    FROM A
      LEFT OUTER JOIN B ON B.num_A=A.id
    GROUP BY A.id

    Si tu sélectionnes les A et les B en même temps, tu vas obtenir :
    Nom numero 5 4 4 + B user 1 2 3
    Nom numero 5 4 4 + B user 1 0 0
    Nom numero 5 4 4 + B user 3 2 1
    Nom numero 3 2 0 + B user 2 2 0
    Nom numero 3 2 0 + B user 0 0 0
    Nom numero 3 2 0 + B user 1 0 0

    Le plus simple serait de sélectionner les A.
    Puis pour chaque A trouvé, sélectionner les B correspondant.

    Si toutefois tu veux le faire en 1 seule requête, c'est possible :
    1. sélectionner tous les B
    2. GROUP BY B.id
    3. joindre au résultat tous les B ayant le même num_A que le résultat
    4. ajouter la somme des nbr dans la clause SELECT

  5. #5
    Membre éclairé Avatar de Space Cowboy
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2005
    Messages
    496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2005
    Messages : 496
    Par défaut
    J'ai fini par faire deux requêtes, je tenterais plus tard de le faire en une seule pour optimiser.
    En plus à cause du NULL renvoyer par la requete qui m'aurais quand même obligé à faire un test, car NULL laisse un blanc dans la page.
    Je ne me souvenez plus de de GROUP BY et je ne connaissez pas SUM.


    Pour info, j'ai ajouter ce code :
    <?php
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    // Calcul du total des jours
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $sql2 = 'SELECT SUM(nbr_jv_consult),SUM(nbr_jv_cp),SUM(nbr_jv_ext),
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SUM(nbr_jrea_consult),SUM(nbr_jrea_cp),SUM(nbr_jrea_ext),
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SUM(nbr_jres_consult),SUM(nbr_jres_cp),SUM(nbr_jres_ext)
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; FROM `gp`
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; WHERE num_adv="'
    .$db_s->f('numero').'"';
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $db_s2->query($sql2);
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $db_s2->next_record();
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    // Test du résultat, si il n'y à rien, on affiche 0
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    if ($db_s2->f('SUM(nbr_jv_consult)') == NULL)
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $nbr_jv_consult = '0';&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jv_cp = '0';&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jv_ext = '0';
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $nbr_jrea_consult = ' 0';&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jrea_cp = '0';&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jrea_ext = '0';
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $nbr_jres_consult = ' 0';&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jres_cp = '0';&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jres_ext = '0';
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $db_s2->seek(0);
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $nbr_jv_consult = $db_s2->f('SUM(nbr_jv_consult)');&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jv_cp = $db_s2->f('SUM(nbr_jv_cp)');&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jv_ext = $db_s2->f('SUM(nbr_jv_ext)');
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $nbr_jrea_consult = $db_s2->f('SUM(nbr_jrea_consult)');&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jrea_cp = $db_s2->f('SUM(nbr_jrea_cp)');&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jrea_ext = $db_s2->f('SUM(nbr_jrea_ext)');
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $nbr_jres_consult = $db_s2->f('SUM(nbr_jres_consult)');&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jres_cp = $db_s2->f('SUM(nbr_jres_cp)');&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$nbr_jres_ext = $db_s2->f('SUM(nbr_jres_ext)');
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;

    ?>
    Colorez votre code PHP sur les forums grâce à Developpez.com

    Pas très joli :/

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

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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