Page 1 sur 1
trier une requete en fonction du plus grand nombre de résultat pour une colonne
Posté : 09 nov. 2016, 19:44
par jp.bond
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
Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne
Posté : 09 nov. 2016, 20:28
par SwypeKeys
Bonsoir, regarde sur
http://sql.sh. C'est possible que tu trouve ta solution la bas.
Re: trier une requete en fonction du plus grand nombre de résultat pour une colonne
Posté : 09 nov. 2016, 21:51
par Patriboom
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
Posté : 10 nov. 2016, 16:06
par jp.bond
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
Posté : 10 nov. 2016, 17:01
par Patriboom
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
Posté : 10 nov. 2016, 17:28
par jp.bond
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
Posté : 10 nov. 2016, 17:37
par Patriboom
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
Posté : 10 nov. 2016, 17:48
par jp.bond
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
Posté : 10 nov. 2016, 17:51
par ynx
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
Posté : 10 nov. 2016, 17:53
par SwypeKeys
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
Posté : 10 nov. 2016, 19:27
par jp.bond
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
Posté : 10 nov. 2016, 20:51
par Patriboom
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é.