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 :

Requête permettant à la fois de récupérer la dernière ligne d'une table et faire la somme d'une colonne


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 Requête permettant à la fois de récupérer la dernière ligne d'une table et faire la somme d'une colonne
    Bonjour à tous
    J'ai une table Mysql dont je veux récupérer le dernier enregistrement et faire la somme d'une colonne contenant les nombre correspondant au dernier matricule enregistré à l'aide d'une requête .voici la table :
    Id nom matricule versement
    1 Loïs 412t 300
    2 Inès 709f 505
    3 Réné 381b 800
    4 Loïs 412t 600

    Je veux récupérer la dernière ligne
    Loïs 412t 600
    et le total de versement pour Loïs qui égale à 300+600=900.
    J'ais fait les requête suivantes :
    1. SELECT id,max( id),nom,matricule, versement FROM table WHERE id=(SELECT max(id) FROM table) ;
    2. SELECT versement, SUM(versement) as total FROM table GROUP BY matricule HAVING max(id) ORDER BY max(id) DESC LIMIT 1;
    3. SELECT id,max(id),nom,matricule,versement, SUM(versement) as total FROM table GROUP BY matricule HAVING id=(SELECT max(id) FROM table) ;


    Avec les deux premières requêtes j'obtiens les résultats escomptés mais la troisième requête dont j'ai besoin poùr mon script PHP ne marche pas.j'ai tenté plusieurs requêtes en vain.
    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 197
    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 197
    Points : 8 414
    Points
    8 414
    Billets dans le blog
    17
    Par défaut
    J'ai une table Mysql dont je veux récupérer le dernier enregistrement
    Pour cela tu utilises ce qui semble être un ID auto-incrémenté, or un tel ID n'a pas de dimension temporelle.
    Il faudrait créer une colonne DATETIME(6) contenant l'horodatage de l'insertion de la ligne et te baser dessus.
    En attendant j'utilise ta table telle quelle.

    Normalement il faut grouper toutes les colonnes non agrégées du SELECT :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ALL Id, nom, matricule, SUM(versement) AS total
    FROM ta_table
    WHERE Id = (SELECT ALL MAX(Id) FROM ta_table) -- À remplacer par un prédicat sur colonne temporelle
    GROUP BY Id, nom, matricule

  3. #3
    Membre confirmé Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 343
    Points : 493
    Points
    493
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT nom , SUM(versement) total
    FROM table T
    LEFT JOIN (
    SELECT Id , Nom
    from table
    ORDER By Id DESC LIMIT 1) Sel on Sel.Nom = T.nom
    GROUP BY nom

  4. #4
    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 Rep
    Bonjour
    Merci pour votre intervention
    J'ai suivi votre recommandation, voici la table:

    Id nom matricule vers date_v
    1 Loïs 412t 300 d1
    2 Inès 709f 505 d2
    3 Réné 381b 800 d3
    4 Loïs 412t 600 d4

    NB: vers = versement.
    Voici la nouvelle requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ALL date_v,nom,matricule,SUM(versement) AS total FROM table WHERE date_v = (SELECT ALL MAX(date_v) FROM table) GROUP BY date_v,nom,matricule;
    J'obtiens la dernière ligne mais pas le total qui est fixé à 600 c'est-à-dire le dernier versement.

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 197
    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 197
    Points : 8 414
    Points
    8 414
    Billets dans le blog
    17
    Par défaut
    Oups oui désolé, j'ai mal lu. Il faut filtrer selon le matricule utilisateur de la dernière ligne et pas l'ID ligne.
    La problématique concernant le choix du dernier utilisateur reste la même => Il faut des horodatages de versement DATETIME(6)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT ALL nom, matricule, SUM(versement) AS somme
    FROM ta_table
    WHERE matricule = (
        -- Sous-requête à revoir quand tu auras les horodatages
        SELECT ALL matricule
        FROM ta_table
        ORDER BY Id DESC
        LIMIT 1
    )
    GROUP BY nom, matricule



    @licardentaistor
    Je vois l'idée, par contre il faudrait un INNER JOIN plutôt qu'un LEFT OUTER JOIN

  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
    Avec séb, le total est bon mais la requête ne me renvoie pas la dernière ligne.

    Quant à licardentaistor , un message d'erreur indique
    ambiguïté de la colonne 'nom'

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 197
    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 197
    Points : 8 414
    Points
    8 414
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par beledo Voir le message
    Avec séb, le total est bon mais la requête ne me renvoie pas la dernière ligne.
    Testée et fonctionnelle.

    Code SQL : 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
    WITH ta_table (id, nom, matricule, versement) AS (
    	VALUES
    		ROW (1, 'Loïs', '412t', 300),
    		ROW (2, 'Inès', '709f', 505),
    		ROW (3, 'Réné', '381b', 800),
    		ROW (4, 'Loïs', '412t', 600)
    )
    SELECT ALL nom, matricule, SUM(versement) AS somme
    FROM ta_table
    WHERE matricule = (
    	-- Sous-requête à revoir quand tu auras les horodatages
    	SELECT ALL matricule
    	FROM ta_table
    	ORDER BY Id DESC
    	LIMIT 1
    )
    GROUP BY nom, matricule

    Donne :

    Si pour toi ça ne fonctionne pas alors donne-nous du code testable, comme je viens de le faire.

  8. #8
    Membre confirmé Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 343
    Points : 493
    Points
    493
    Par défaut
    il doit manquer un alias de table pour nom dans le 1er select:

    mais ça doit faire le job.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT T.nom , SUM(versement) total
    FROM table T
     JOIN (
    SELECT Id , Nom
    from table
    ORDER By Id DESC LIMIT 1) Sel on Sel.Nom = T.nom
    GROUP BY T.nom

Discussions similaires

  1. [XL-2013] Récupérer la dernière ligne d'une colonne.
    Par licpegpon dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/04/2019, 12h57
  2. Récupérer la dernière ligne d'une table SQL
    Par supcomingenieur dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/05/2013, 17h26
  3. [Débutant] Récupérer la dernière ligne d'une RichTextBox
    Par johann77 dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/12/2011, 19h34
  4. identifier la dernière ligne d'une colonne avec VB Excel
    Par schwoby dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/08/2007, 18h14
  5. Excel VBA - Dernière ligne d'une colonne
    Par sat478 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/12/2005, 17h33

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