Organiser le desordre

TTMan Messages postés 104 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 12 février 2007 - 29 mars 2006 à 09:04
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 - 30 mars 2006 à 16:25
Bonjour,
(J'ai posé cette question sur aspfr.com et l'on m'a conseillé de la poser ici, merci de votre aide).

Je vous expose mon problème, qui cherche la meilleur solution du point de vue performances.

J'interroge une base de données (SQL SERVER) depuis mon codebehind en C# (ASP.net) pour obtenir une liste de produits triés par prix.
J'ai plusieurs champs, dont le prix et le producteur, qui sont retournés. Je souhaite ensuite afficher les produits en liste en organisant un desordre qui aura pour effet de créer de la diversité dans ladite liste au niveau du champs "producteur".
Pour faire ce desordre, je voudrais en fait que la liste soit triée par prix tout en mélangeant les fabricants. Le trix par prix ne doit pas être stric, il y a une fourchette de 5 euros qui fait qu'on considère qu'on est dans le même ordre de prix. Et j'aimerais que la répétition du même producteur se fasse 3 fois maximum...

Exemple de ma liste actuelle triée par prix:
pomme - 5 euros - producteur1
poire - 5.5 euros - producteur1
toto - 6 euros - produsteur1
...(autant de produit que voulu sans dépasser le prix de la ligne qui suit)...
titi - 7 euros - producteur2
tata - 7.80 euros - producteur2

Exemple de ce que je souhaite avoir:
pomme - 5 euros - producteur1
poire - 5.5 euros - producteur1
toto - 6 euros - produsteur1
titi - 7 euros - producteur2
...(de 1 à 3 produits d'un autre producteur)...
titi - 7.8 euros - producteur2

Si quelqu'un a une idée, je suis preneur.
A l'heure actuelle je récupère la liste triée par prix issue de ma requête SQL du type
Select * from TABLE where type='typeproduit' ORDER BY prix

Merci.
TTMan

11 réponses

Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
29 mars 2006 à 09:45
Tu peux redonner un exemple un peu plus concret ? J'ai une idée, mais je veux etre sur d'avoir bien compris...
0
TTMan Messages postés 104 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 12 février 2007
29 mars 2006 à 11:37
Euh, plus concret je sais pas si c'est ce qui va suivre, mais un peu plus complet...

J'ai 3 champs (désignation, prix, producteur) dans la table (articles), pour obtenir les enregistrements je fais ceci:
SELECT * FROM articles ORDER BY prix

Liste de base ainsi obtenue:
pomme1 5euros producteur1
pomme2 5.5 euros producteur1
poire 5.5 euros producteur1
quetsch 6 euros producteur1
pomme_alpha 7 euros producteur2
peche 7 euros producteur3
quetsch_2 7 euros producteur1
pomme_beta 8 euros producteur2
abricot 11euros producteur2

et j'aimerais pouvoir afficher une liste de ce type:
pomme1 5euros producteur1
pomme2 5.5 euros producteur1
poire 5.5 euros producteur1 (là, si je suis à +/- 5euros il faut changer de producteur parce que je l'ai trois fois de suite)
pomme_alpha 7 euros producteur2 (on peut avoir 3 fois de suite le producteur 2 ou aller à un autre producteur si le producteur2 s'éloigne trop en terme de prix)
peche 7 euros producteur3 (le producteur 3 a un article au même prix que le précédent)
quetsch 6 euros producteur1
quetsch_2 7 euros producteur1 (ici j'imagine que je n'ai plus d'articles du producteur 1, donc je prend l'article qui est au prix le plus proche et qui suit)
pomme_beta 8 euros producteur2 (cet article aurait aussi pu être placé après celui du producteur3 à 7 euros, si ça simplifie le codage)
abricot 11euros producteur2

J'espère que ce n'est pas trop embrouillé.
Merci
0
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
29 mars 2006 à 22:43
Warf, c'est un peu le bordel, mais je pense comprendre, je réfléchis à ca cette nuit, je reposte demain matin... ;o)
0
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
30 mars 2006 à 13:41
Bon, il faut trier sur autre chose que le prix, forcément.

Essaye un truc comme ca :

SELECT *, (((5*rand())-2.5)*prix) AS tri
FROM tatable
ORDER BY tri

on s'occupera des 3 fournisseurs une autre fois ;o)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TTMan Messages postés 104 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 12 février 2007
30 mars 2006 à 13:54
Ok je vais tester, je te remercie déjà de ton aide.
0
TTMan Messages postés 104 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 12 février 2007
30 mars 2006 à 14:45
J'ai testé et... le tri se fait comme par le prix sauf que parfois c'est croissant, parfois décroissant parce que tri est positif ou négatif... Je pense que ça vient de la fontion rand().

Le hic, c'est que pour l'instant ça n'a pas résolu mon problème :-)
0
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
30 mars 2006 à 15:01
Oups !!!

SELECT *, (((5*rand())-2.5)+prix) AS tri
FROM tatable
ORDER BY tri

Il faut mettre un '+', pas un '*' !!! :o)
Ré-essaye comme ca ?
0
TTMan Messages postés 104 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 12 février 2007
30 mars 2006 à 15:18
Ok, là on retrouve le même fonctionnement qu'avec le ORDER BY prix, il n'y a plus l'effet croissant / décroissant. L'idée du rand() m'a fait fouiller un peu sur le net et j'ai trouvé que rand() génère une valeur pour chaque ligne avec MySQL, mais sous SQL Server ça n'en génère qu'une pour le lot d'enregistrement retourné... Celà explique donc pourquoi dans l'immédiat je me retrouve avec une requete évoluée qui me retourne la même chose qu'au départ...
0
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
30 mars 2006 à 15:26
Arg !
Il m'en veut SQL aujourd'hui :o)
Et si tu essayes un truc genre :
SELECT *, (((5*rand(id))-2.5)+prix) AS tri
FROM tatable
ORDER BY tri

Comme ca, tes id étant tous différents, tu auras l'impression d'avoir du hasard. En même temps, les mêmes produits s'afficheront toujours dans le même sens (ce qui est pas plus mal)...

Alors ? ^^
0
TTMan Messages postés 104 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 12 février 2007
30 mars 2006 à 16:23
lol non SQL ne t'en veux pas, c'est mon boss qui veut un truc infaisable!!!

Par contre, il y a un petit changement avec ton idée (que j'avais juste tentée après mon post précédent): les articles arrivent triés par prix puis par id on a donc réinventé le "ORDER BY prix, id"...

Alors j'ai un peu cherché encore du cote de newid(), qui génère une valeur pour chaque ligne (mais un id en hexa) et j'ai fais ça:

SELECT *, (((5*rand(cast(newid() as varbinary)))-2.5)+prix) AS tri


FROM tests


ORDER BY tri

et... ça marche comme avec un rand() normal avec MySQL. donc on a règlé une partie du problème.
Maintenant je n'ai plus un tri stric par prix, mais par plage de prix, dans lesquelles c'est l'anarchie souhaitée.

Merci de ton aide pour celà. Si tu as une piste pour limiter les répétitions sur le champs producteur, je suis preneur.
0
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
30 mars 2006 à 16:25
En reflexion, mais c'est pas evident du tout... :o)
0
Rejoignez-nous