[RESOLU] trier une requete en fonction du plus grand nombre de résultat pour une colonne

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] trier une requete en fonction du plus grand nombre de résultat pour une colonne

Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne

par Patriboom » 10 nov. 2016, 20:51

arf, là tu m'as perdu...
qu'entends tu par "*.PROD" ou "Combien" ou "NB" ?
Il semble, ci-bas, que tu t'y sois retrouvé.
Si t'as des questions, n'hésite pas.
Veuille aussi pardonné mes fautes de frappe qui ont empêché le code de fonctionné derechef. Tant mieux si c'est ce qui t'a fait progressé.

Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne

par jp.bond » 10 nov. 2016, 19:27

merci de vos réponses !
effectivement la méthode de Swypekeys fonctionne très bien, et celle de Patriboom ne marchait pas, mais après quelques petites modifs, cela fonctionne aussi comme cela :
SELECT PROD.*, (SELECT COUNT(id_marque) FROM `produits` AS NB WHERE NB.id_marque = PROD.id_marque GROUP BY `id_marque`) AS Combien
FROM `produits` AS PROD
ORDER BY Combien DESC

Merci de votre aide !!

Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne

par SwypeKeys » 10 nov. 2016, 17:53

Il faut utiliser une jointure dans ta requête :
http://sql.sh/cours/jointures

Code : Tout sélectionner

SELECT * FROM produits p JOIN ( SELECT `id_marque`, COUNT(*) AS cnt FROM produits GROUP BY `id_marque` ) p2 ON ( p2.id_marque = p.id_marque ) ORDER BY p2.cnt DESC;

Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne

par ynx » 10 nov. 2016, 17:51

Il y a bien la solution avec des UNION et des requêtes imbriquées mais que je trouve loin d'être optimisée :
SELECT * FROM produits WHERE id_marque = (SELECT id_marque FROM produits GROUP BY id_marque ORDER BY COUNT(id_marque) DESC LIMIT 0,1)
UNION
SELECT * FROM produits WHERE id_marque = (SELECT id_marque FROM produits GROUP BY id_marque ORDER BY COUNT(id_marque) DESC LIMIT 1,1)
UNION
SELECT * FROM produits WHERE id_marque = (SELECT id_marque FROM produits GROUP BY id_marque ORDER BY COUNT(id_marque) DESC LIMIT 2,1)

Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne

par jp.bond » 10 nov. 2016, 17:48

arf, là tu m'as perdu...
qu'entends tu par "*.PROD" ou "Combien" ou "NB" ?

Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne

par Patriboom » 10 nov. 2016, 17:37

Alors tu peux mettre ton champ de comptage en sous-requête.

SELECT *.PROD, (SELECT id_marque,COUNT(id_marque) AS nb_marque
FROM `produits` AS NB WHERE NB.id_marque = PROD.id_marque
GROUP BY `id_marque`) AS Combien
FROM `produits` AS PROD
ORDER BY Combien DESC

Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne

par jp.bond » 10 nov. 2016, 17:28

cette méthode ne marche pas puisque les lignes ont été fusionnées par la commande GROUP BY `id_marque` !?
Avec ta requete ne n'obtient qu'un tableau de résultats de 6 lignes (correspondant aux 6 différentes valeurs de id_marque) alors que dans ma table il y a actuellement 93 lignes...

Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne

par Patriboom » 10 nov. 2016, 17:01

Il te faut appeler aussi les champs de la table, voici une méthode

SELECT *.PROD, id_marque,COUNT(id_marque) AS nb_marque
FROM `produits` AS PROD
GROUP BY `id_marque`
ORDER BY nb_marque DESC

Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne

par jp.bond » 10 nov. 2016, 16:06

ok et merci pour ces précisions.
j'ai donc essayé de faire cette requète :

SELECT id_marque,COUNT(id_marque) AS nb_marque
FROM `produits`
GROUP BY `id_marque`
ORDER BY nb_marque DESC

Et j'arrive bien à obtenir un tableau de résultats ordonnés, contenant 2 colonnes :

id_marque | nb_marque
3.....................41
2.....................24
4.....................15
34....................6
5.....................4
1.....................3

Sauf que je ne peux pas afficher les résultats complets de chacune de mes lignes de ma requête initiale :
SELECT * FROM produits ORDER BY id_marque,nom

en l'ordonnant par le critère qui m’intéresse, à savoir :
ORDER BY nb_marque DESC

puisque GROUP BY `id_marque` fusionne les lignes....

Car ce que je souhaitais arriver à faire, c'etait afficher les :
41 lignes de la marque 3 en premier,
puis les 24 lignes de la marque 2 en deuxieme,
puis les 15 lignes de la marque 4 en troisieme
etc...

Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne

par Patriboom » 09 nov. 2016, 21:51

Afin de ne pas te perdre dans la référence donnée, va voir dans « GROUP BY » pour que soit comptabilisés le nombre de résultats correspondant à un critère. Ce - ou ces critères - sont définis par « WHERE »
Ensuite, tu pourras utiliser les commande SELECT .... FROM .... WHERE .... GROUP BY .... ORDER BY ...

Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne

par SwypeKeys » 09 nov. 2016, 20:28

Bonsoir, regarde sur http://sql.sh. C'est possible que tu trouve ta solution la bas.

trier une requete en fonction du plus grand nombre de résultat pour une colonne

par jp.bond » 09 nov. 2016, 19:44

Bonjour
je suis en train de construire un affichage d'une liste de produits.
Ces produits ont chacun une marque.

J'ai donc une table "marques" dans ma base, et une table "produits" contenant un id_marque pour chaque ligne.

J'aimerai afficher mes produits en les ordonnant, en commençant par les produits de la marque qui a le plus de produits, puis passer à la seconde marque qui a le plus de produits...Etc...

Je sais ordonner une requete par rapport à l'ordre alphabétique d'une colonne, mais je ne sais pas faire plus...
J'aurai pu faire une passe juste pour compter les produits de chaque marque et ensuite ordonner ainsi, mais il me semble qu'il doit y avoir une solution plus simple et moins gourmande en ressources, non ?

Peut etre une requete imbriquée dans une autre ?
je ne sais pas... et surtout je n'ai pas trouvé de sujets sur ce point... surement car je ne trouve pas les bons mots clés...

Merci de votre aide