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 :

Comment additionner des valeurs dans des lignes différentes issues d'une requête SELECT


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut Comment additionner des valeurs dans des lignes différentes issues d'une requête SELECT
    Bonjour,
    Je voudrais additionner les valeurs issues de la requête suivante mais je ne sais pas jongler avec les tableaux

    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
    <?php
     
    $servername = "localhost";
    $username = "bernard";
    $password = "password";
    $dbname = "elevage";
     
    $mysqli = new mysqli($servername, $username, $password, $dbname);
    // Check connection
     
    $query = "SELECT * FROM testlactique WHERE id = ((SELECT MAX(id) FROM testlactique) - 5) ";
    $result = $mysqli->query($query);
     
    if (!$result) {
      die('<p>ERREUR Requête invalide : '.$mysqli->error.'</p>');
    }
      $row = $result->fetch_assoc() ;
      $nom = $row['V'] ;
      $prenom = $row['id'] ;
      echo '<p>'.$prenom.' '.$nom.'  </p>'."\r\n" ;

    ce programme m'affiche bien les 5 lignes extraites de la table MySQL mais comment faire pour additionner ou soustraire les 5 valeurs de la row['V'] ?
    J'ai essayé d'introduire un indice $i à $row $row[$i] mais je me fais insulter par le système.
    Une aide serait bienvenue ,merci
    (Mon niveau est quasi débutant )

  2. #2
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    pour pouvoir te répondre, il serait plus simple de pouvoir exécuter ton code. Peux-tu donner la DDL de la table testlactique dans la bdd elevage ? (La définition SQL de la table avec un CREATE)
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    je suppose que la DDL est ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MariaDB [elevage]> desc testlactique;
    +----------------+---------------+------+-----+-------------------+-----------------------------+
    | Field          | Type          | Null | Key | Default           | Extra                       |
    +----------------+---------------+------+-----+-------------------+-----------------------------+
    | id             | int(10)       | NO   | PRI | NULL              | auto_increment              |
    | commentaire    | text          | YES  |     | NULL              |                             |
    | V              | decimal(10,4) | YES  |     | NULL              |                             |
    | date_insertion | timestamp     | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
    +----------------+---------------+------+-----+-------------------+-----------------------------+

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonjour Optom,

    Si le choix de décrémenter de 5 l'identifiant a pour but de rechercher un certain rang d'identifiant d'un point de vue chronologique, alors, vous faites fausse route :
    Dans un environnement multi-thread et multi-utilisateurs, il n'y a aucune garantie pour que l'identifiant de valeur par exemple 50 ait été inséré avant celui de valeur 52.
    Pour garantir la restitution dans l'ordre chronologique, il faut utiliser une colonne d'horodatage ou un chrono qui ne soit pas attribué par le SGBD (pas un auto_incrément donc).

    De plus, la valeur id-5 peut fort bien ne pas exister : cas d'une ligne physiquement supprimée par DELETE ou d'un chrono réservé mais non commité (et donc jamais inséré)

    EDIT : et, cas très marginal mais qui peut se produire, chrono supprimé physiquement puis réutilisé par forçage de la valeur dans une requête !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    je suis dans un réseau local ( raspberry avec joomla ) je ne pense donc pas avoir ce genre de désagréments .

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    je fais réapparition ; je n'ai pas pu avant car j'avais des problèmes (techniques) qui m'en ont empêché.

    Tout d'abord, de ce que tu as donné, j'ai pu déduire la DDL (Data Definition Language) de la table testlactique :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DROP TABLE IF EXISTS `testlactique`;
    CREATE TABLE `testlactique` (
      `id` int NOT NULL AUTO_INCREMENT,
      `commentaire` text COLLATE utf8_bin NOT NULL,
      `V` decimal(10,4) NOT NULL,
      `dateinsertion` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    Sinon, j'avoue ne pas comprendre ce que tu souhaites. Pour que je comprenne, le mieux serait de donner un exemple : données de départ->données souhaitées.
    Ayant construit un environnement de test, je ne mettrais pas 5 jours à répondre
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    je cherche à soustraire $row[V] de la ligne n à $row[V] de la ligne n-5
    je cherche donc à indicer les valeurs dans la colonne V (ou une autre)

  8. #8
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Désolé, mais je comprends toujours pas. Peux-tu donner un exemple (contenu actuel de la table et contenu attendu) ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    De plus, la valeur id-5 peut fort bien ne pas exister : cas d'une ligne physiquement supprimée par DELETE ou d'un chrono réservé mais non commité (et donc jamais inséré)
    Citation Envoyé par optom Voir le message
    je suis dans un réseau local ( raspberry avec joomla ) je ne pense donc pas avoir ce genre de désagréments .
    Jamais de delete ni de transaction non commitée ? Certain ?
    et je plussoie la demande d'exemple avant/après

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    Un truc dans ce gout là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT V - LEAD(V, 5) OVER(ORDER BY dateinsertion) FROM ...

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    j'ai retrouvé un ancien programme dans lequel figurait une solution à mon problème:
    pour reconstituer un tableau avec indice , extrait grâce à select , on utilise la boucle while et on indice les valeurs du tableau extrait , ce qui permet de soustraire la ligne i avec la ligne i-5 par exemple
    $ydata est ainsi indicé en $ydata[$i], je peux donc faire des opérations entre les différentes lignes du tableau.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $Result = mysqli_query($mysqli,"SELECT * FROM testlactique WHERE id > ((SELECT MAX(id) FROM testlactique) - $passe) ") or die ( mysqli_error($mysqli));
    $ydata = array();
    $i = 1;
     
    while ($row = mysqli_fetch_array($Result)) { 
        $valeur = ($row["V"] ) ;
        $ydata[$i] = $valeur;

    merci pour votre aide
    je ne ferme pas encore le post dans le cas il y aurait d'autres commentaires intéressants

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonjour

    Une requête ensembliste est toujours plus performante qu'une boucle.
    La solution proposée par aieeeuuuuu par exemple est préférable, mais sous réserve que vous ayez MySQL V8 car les versions antérieures n'incluent pas les fonctions fenêtrées.

  13. #13
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Optom, ça serait mieux de donner le code complet car dans la discussion #11, il n'y a que le début de la boucle...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par optom Voir le message
    je suis dans un réseau local ( raspberry avec joomla ) je ne pense donc pas avoir ce genre de désagréments .
    Il n'y a JAMAIS aucune garantie de la continuité de la séquence.

    Par exemple si l'application est fermée au moment du calcul d'un ID et avant son attribution, alors cet ID sera définitivement perdu et vous aurez un trou.
    Ce que vous affirmer est connu sous le nom de "effet Titanic". Le Titanic étant insubmersible, il ne devait pas couler....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    voila le code complet qui m'affiche un joli tableau avec un certain nombre de ligne ($nbechant, en fait).
    mais j'ai un nouveau challenge : je voudrais remplir une table mysql avec les lignes du tableau.
    Puisque j'ai des valeurs indicées par ligne (exemple $conc[$i], $i étant le numéro de ligne extraite) j'ai donc pensé ajouter dans la boucle while un (
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $query = "INSERT INTO resultatslactique( concentration ,deltaabsorbance ) VALUES ($conc[$i], $delta[$i]) ";
            $mysqli->query($query); }
    )
    mais seule la 1ere ligne se stocke dans la table "resultatslactique"!
    auriez-vous une idée ?
    d'avance merci

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    <?php
    $servername = "localhost";
    $username = "bernard";
    $password = "mdpbg";
    $dbname = "elevage";
     
    $mysqli = new mysqli($servername, $username, $password, $dbname);
    // Check connection
     
     
    $query = "SELECT * FROM serielactique WHERE id = (SELECT MAX(id) FROM serielactique) ";
    $result = $mysqli->query($query);
     
    /* Tableau numérique */
    $row = $result->fetch_array(MYSQLI_NUM);
    $nbechant = $row[5];
     
    $passe = ($nbechant + 2) * 2;
    $etalon1 = $row[1];
     
    $Result = mysqli_query($mysqli,"SELECT * FROM testlactique WHERE id > ((SELECT MAX(id) FROM testlactique) - $passe) ") or die ( mysqli_error($mysqli));
    $ydata = array();
    $i = 1;
     
    while ($row = mysqli_fetch_array($Result)) { 
        $valeur = ($row["V"] ) ;
        $ydata[$i] = $valeur;
     
    if ($i > $nbechant +2 and $i != $nbechant + 3 and $i != $nbechant + 4)
     {
    $diff = $i - $nbechant-2;
    //echo "$diff[$i]";
    $delta[$i] = log10($ydata[$diff] / $ydata[$i]) ;
    $calV9 = $nbechant + 3;
    $calV10 = $nbechant +4;
     
    $pentecal = $etalon1 / (log10($ydata[2] / $ydata[$calV10]) - log10($ydata[1] / $ydata[$calV9]));
    //echo " pente $pentecal";
    $pointorigine =  (-$pentecal * log10($ydata[1] / $ydata[$calV9]));
    $rapport = log10($ydata[1] / $ydata[$calV9]);
    $conc[$i] = ($pentecal * log10( $ydata[$diff] / $ydata[$i])) + $pointorigine;
    $ordre = $i - $nbechant -4;
     
    $query = "INSERT INTO resultatslactique( concentration ,deltaabsorbance ) VALUES ($conc[$i], $delta[$i]) ";
            $mysqli->query($query); }
     
    ?>
     
            <table color="red" border="10" size="20">
    <table style="background-color:#A3E4E2" size="20">
            <thead>
                    <tr>
                            <th>ydata</th>
                            <th>delta</th>
                            <th>concentration</th>
                            <th>i</th>
     
                    </tr>
            </thead>
     
            <tbody>
     
     
                    <tr>
                            <td width="20%" align="center" style="font-size:5vw;"><?php echo number_format($ydata[$i], 0) ; ?></td>
                            <td width="30%" align="center" style="font-size:5vw;"><?php echo number_format($delta[$i], 3) ; ?></td>
                            <td width="40%" align="center" style="font-size:5vw;"><?php echo number_format($conc[$i], 2) ; ?></td>
                            <td style="font-size:5vw;" align="center"><?php echo $ordre; ?></td>
     
                    </tr>
            </tbody>
     
            </table>
    <?php
     
    mysqli_close($mysqli);
     
    }
     
        $i++;
     
     
    }
     
    mysqli_close($mysqli);
     
    ?>

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Je viens de comprendre pourquoi seule la 1ere ligne etait enregistrée dans ma boucle while : j'avais fermé l'acces à mysql à la fin de la boucle avec mysqli_close($mysqli); donc à la 1ere boucle le stockage etait impossible .
    tout fonctionne maintenant .

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

Discussions similaires

  1. [PHP 5.6] Recherche de valeur dans le tableau de résultats d'une requête SQL
    Par CinePhil dans le forum Langage
    Réponses: 4
    Dernier message: 04/02/2019, 13h01
  2. Comment additionner des lignes de temps (durée)
    Par xyloup dans le forum Access
    Réponses: 3
    Dernier message: 25/11/2016, 15h04
  3. [XL-2003] Comment avoir des lignes de différentes couleurs dans un combobox
    Par MichaSarah dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/10/2009, 05h10
  4. [MySQL] Condition en fonction des lignes de résultat d'une requête
    Par darkloy dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/09/2008, 23h01
  5. Réponses: 4
    Dernier message: 02/09/2004, 14h50

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