[SQL] Requête sur nombre d'occurrences
lkaiser
Messages postés
7
Statut
Membre
-
lkaiser -
lkaiser -
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
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
-
Bonjour,
Il existe des fonctions comme COUNT et GROUP BY.
Cela devrait suffire pour faire ce que tu demandes.
-
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-
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. ..- En 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
-
-
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 -
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
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 ....