[SQL] Requête sur nombre d'occurrences

Bonjour à tous,

Je ne suis pas un pro du SQL (du moins pas pour le moment) alors je vous sollicite pour m'aider a résoudre un petit problème.
Voila je cherche depuis quelques heures comment faire une requête qui remonterait le enregistrements en doublon sur un champ particulier, et les trierait par nombre d’occurrences.
Typiquement sur une table contenant les lignes de factures, je souhaiterais la trier DESC par nombre de lignes appartenant à une même facture.
Heu j’espère que j'ai été assez explicite parce que ce n'est pas si évident.

Merci de vos réponses

Cordialement

5 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Bonjour,

    Il existe des fonctions comme COUNT et GROUP BY.
    Cela devrait suffire pour faire ce que tu demandes.

    1. Bonjour,

      si tu crées les entrées depuis une page web, tu veux éviter les doublons en mettant une fonction.

      On regarder avant d'enregistrer si un tuple existe déjà un enregistrement pour la société X pour une date donnée

      function sql_facture_exists($nom_client , $date) {
      //retourne true si le client existe
      $query = "SELECT COUNT(*) 
                     FROM factures
                     WHERE nom_client='" . $nom_client . "'
                     AND    date    =  '" . $date . "';";
      	$result = execute_query($query);
      	$row    = mysql_fetch_array($result);
      	$result = ($row[0]>0);
      	return $result;
      }//end function
      
      
      if (!sql_facture_exists($nom_client , $date)) {
      echo "<h2>Facturecréé.</h2>\n";
      $query = "INSERT INTO clients (id_facture, id_client, date_facture, ...) 
      	VALUES (NULL , '$id_client', '$date_facture', ...) ;";
      execute_query($query);
      }//end if
      else {
      echo "<h2>Facture non créé.   </h2 \n";
      echo "Facture  déjà existante pour le client: \"$nom_client\" <br/>	\n";
      }//end if
      1. Modérateur
        Bonjour Delnc.
        Attention. .. tu utilises toujours l'ancienne extension de mysql considéré comme obsolète. ..
        il serait temps de passer à mysqli ou a pdo.
        de plus.. ta réponse n'a pas vraiment de rapport avec la question. .. sans parler du fait que nous ne savons pas si l'utilisateur developpe en php....
        ni même quel SGBD il utilise vraiment. ..
      2. Modérateur
        @jordane45En complément :
        https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top

        et : https://www.commentcamarche.net/faq/44117-connexion-a-une-base-avec-pdo-mysqli

        et enfin (si tu prends PDO) : https://www.commentcamarche.net/faq/27489-pdo-une-autre-facon-d-acceder-a-vos-bases-de-donnees
    2. Merci Jordane pour les infos mais cela ne m'apporte rien de plus que ce que je connaissais déjà et avec lequel je suis toujours en galère ^^

      Pour résumer, j'ai une table contenant N champs dont l'un est le numéro de contrat (NumContrat) et je souhaite trier cette table par regroupement de numéro de contrat descendant.

      Les X premières lignes de la vue, après requête, correspondront au plus grand nombre de lignes pour un même numéro de contrat, les Y suivantes au deuxième plus grand nombre de lignes ... etc ... pour finir à la fin avec les singletons :

      J'ai essayé ce code mais cela ne semble pas suffisant :
      SELECT *
      FROM MaTable
      GROUP BY NumContrat
      ORDER BY CONT(NumContrat)


      peut être faut il imbriquer deux requête ?

      Merci
      1. Modérateur
        Tu peux utiliser une sous requête avec une jointure.
        par exemple :
        SELECT  T1.login_cnx,T1.NB, T2.*
        FROM
        (
         SELECT C.login_cnx,COUNT( C.login_cnx) as NB 
           FROM c_histo_login C
           GROUP BY C.login_cnx
           ORDER BY count(*) DESC
         )T1
         LEFT JOIN c_histo_login T2 ON T1.login_cnx =  T2.login_cnx
         ORDER BY  T1.NB DESC
         
        
        1. merci Jordane45

          je vois l'idée de la requête, je teste cela demain !
          merci en tout cas, je pense pas que j'aurais pu trouver tout seul ....