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

PHP & Base de données Discussion :

Obtenir le total de deux ou plusieurs tables [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juillet 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juillet 2021
    Messages : 14
    Points : 9
    Points
    9
    Par défaut Obtenir le total de deux ou plusieurs tables
    Bonjour,

    J’ai les deux tables suivantes :

    Table1

    Id noms montant post date
    1 cedric 500 1w 2021-07-25
    2 Roland 1200 1w 2021-07-25
    3 Alain 800 1w 2021-07-26
    4 Loïs 700 1w 2021-07-26


    Table2

    id noms montant post date
    1 Sylvie 400 1w 2021-07-25
    2 Jules 900 1w 2021-07-25
    3 marc 300 1w 2021-07-26
    4 Laure 1400 1w 2021-07-26

    Je veux faire le total des sommes des deux tables.
    Soit somme1(table1) = 3200
    Somme2(table2) = 3000
    Total = 3200+3000 = 6200
    Dans les deux tables la colonne ‘post’ est pour la jointure.
    En voulant obtenir le total= 6200 , j’ai fait la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT  c.montant,t1.montant,SUM(t1.montant+t2.montant) AS total FROM table1 t1 INNER JOIN table2 t2 ON t2.post = t1.post ";
    Seulement ma requête ne fonctionne bien que dans le cas suivant où j’obtiens total = 900 :

    Table1

    Id noms montant post date
    1 cedric 500 1w 2021-07-25
    2 Roland 1200 NULL 2021-07-25
    3 Alain 800 NULL 2021-07-26
    4 Loïs 700 NULL 2021-07-26


    Table2

    id noms montant post date
    1 Sylvie 400 1w 2021-07-25
    2 Jules 900 NULL 2021-07-25
    3 marc 300 NULL 2021-07-26
    4 Laure 1400 NULL 2021-07-26


    J’ai lu les faq et tutoriels en vain. Je n’y arrive pas.
    Merci d’avance pour votre aide.

    Mon code :
    Code php : 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?php
    $host = 'localhost';
    $dbname = 'bdd';
    $username = 'Y';
    $password = 'X';
    $dsn = ("mysql:host=$host;dbname=$dbname");
    // récupérer tous les utilisateurs
     
    $sql = "SELECT t1.montant,t2.montant,SUM(t1.montant+t2.montant) AS total FROM table1 t1 INNER JOIN table2 t2 ON t2.post = t1.post ";
    try{
    $pdo = new PDO($dsn, $username, $password);
    $stmt = $pdo->query($sql);
    if($stmt === false){
    die("Erreur"); 
    }
     
    }catch (PDOException $e) 
    {
    echo $e->getMessage();}
     
    ?>
     
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    </head>
    <body>
    <h1>Le total des deux tables</h1>
    <table width="80%" border="1" cellspacing="0" bordercolor="#FFFFFF">
    <thead>
    <tr>
    <td><span style="position: absolute; bottom: 200px; left: 10px; width: 242px; heigth: 70px;">
    TOTAL =
    </span></td>
    </tr>
    </thead>
    <tbody>
    <?php while($row = $stmt->fetch(PDO::FETCH_ASSOC)): ?>
    <tr>
    <td><span style="position: absolute; bottom: 200px; left: 220px; width: 242px; heigth: 70px;"><?php echo htmlspecialchars($row['total']);?>&nbspFCFA</span></td>
    </tr>
    <td><?php endwhile; ?></td>
    </tbody>
    </table>
    </body>
    </html>
    *
    *

  2. #2
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 361
    Points : 737
    Points
    737
    Par défaut
    Bonjour,

    Une solution possible :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(montant) AS total FROM (SELECT montant FROM table1 UNION SELECT montant FROM table2) t

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juillet 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juillet 2021
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonjour PYtet,

    merci pour votre reponse.

    Lorsque j'applique votre requête aux tables telles que j'ai donné, ça marche bien et donc j'obtiens un total = 6200. Mais lorsque j'ai renseigné une ligne de plus comme suit, ça ne marche pas:

    Table1

    Id noms montant post date
    1 cedric 500 1w 2021-07-25
    2 Roland 1200 1w 2021-07-25
    3 Alain 800 1w 2021-07-26
    4 Loïs 700 1w 2021-07-26
    5 René 600 1w 2021-07-28

    Table2

    id noms montant post date
    1 Sylvie 400 1w 2021-07-25
    2 Jules 900 1w 2021-07-25
    3 marc 300 1w 2021-07-26
    4 Laure 1400 1w 2021-07-26
    5 Laurent 300 1w 2021-07-28


    Au lieu d'avoir un total = 7100 , j'ai un total = 6800
    En effet mon objectif est d'avoir un bon compte lorsque des lignes sont renseignées soit dans une table ou les deux, donc d'un total dynamique.
    merci d'avance.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 238
    Points : 8 502
    Points
    8 502
    Billets dans le blog
    17
    Par défaut
    2 méthodes.

    Avec des sous-requêtes :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ALL 
        (SELECT ALL SUM(montant) FROM table1 WHERE post = 'w1') 
        + (SELECT ALL SUM(montant) FROM table2 WHERE post = 'w1')
        AS total

    Avec un UNION :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT ALL SUM(montant) AS total
    FROM (
        SELECT ALL montant
        FROM table1
        WHERE post = '1w'
        UNION ALL
        SELECT ALL montant
        FROM table2
        WHERE post = '1w'
    ) AS _

    Mais note bien que ta problématique peut signaler un problème de conception de ta base. Pourquoi n'as-tu pas 1 seule table ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juillet 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juillet 2021
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    les deux méthodes marchent bien, les comptes sont bons.
    merci et encore merci à toi Séb.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juillet 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juillet 2021
    Messages : 14
    Points : 9
    Points
    9
    Par défaut Obtenir le total des sommes de deux colonnes de deux tables en fonction de la date d'enregistrement
    Bonjour ,
    Je veux à partir de deux tables suivantes, obtenir le total de deux colonnes en fonction d'une date d'enregistrement. Comme cet exemple :
    Table1

    Désignation prix. Date_achat
    Stylo. 500. 02-10-2021
    Crayon. 300 02-10-2021
    Cahier. 1000 05-10-2021
    Règle. 700 05-10-2021

    Table2:

    Désignation prix. Date_achat
    Gomme. 400. 02-10-2021
    Compas. 600 02-10-2021

    Ma requête est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sreq = " SELECT (SELECT ALL SUM(prix) FROM table1 WHERE date_achat LIKE ?) + (SELECT ALL SUM(prix) FROM table2 WHERE date_achat LIKE ?) AS total"
    Lorsque je soumets la date_achat =02-10-2021, j'ai le total = 1800, ce total est juste.
    Par contre lorsque je soumets la date_achat =05-10-2021, le total ne s'effectue pas alors que je m'attends à un total=1700.
    Je suis bloqué , merci d'avance pour votre aide.

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 238
    Points : 8 502
    Points
    8 502
    Billets dans le blog
    17
    Par défaut
    S'il n'y a pas d'enregistrements dans 1 table, cela correspond à quelque chose comme "SELECT 1200 + NULL"
    => Additionner NULL à autre chose donne toujours NULL

    Avec COALESCE() tu obtiens la 1re valeur non NULL parmi les paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COALESCE(1200, 0) + COALESE(NULL, 0)
    Revient à :

    Essaie donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sreq = <<<SQL
        SELECT
            COALESCE((SELECT ALL SUM(prix) FROM table1 WHERE date_achat LIKE ?), 0)
            + COALESCE((SELECT ALL SUM(prix) FROM table2 WHERE date_achat LIKE ?), 0)
            AS total
        SQL;
    COALESCE() => https://dev.mysql.com/doc/refman/8.0...ction_coalesce

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juillet 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juillet 2021
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    Super!!!, votre requête marche parfaitement. En plus de cela, le lien que vous m'avez donné est excellent. Merci beaucoup à toi Séb, tu es un grand Expert.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/03/2011, 23h26
  2. Réponses: 4
    Dernier message: 16/07/2010, 12h03
  3. Nombre total d'éléments dans plusieurs tables avec SQL
    Par mistermiss dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/05/2009, 23h23
  4. [MySQL] Récupérer des variables via plusieurs tables (32 au total ^^)
    Par streeter dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 20/05/2006, 17h14
  5. [Excel] Total de valeurs dans plusieurs feuilles
    Par Fealendril dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/01/2006, 12h25

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