|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() David Inscription : décembre 2010 Messages : 10 ![]() |
Bonjour,
J'ai un petit soucis pour faire une requête. J'utlise Mysql 5.1 avec ligne de commande ou phpmyadmin pour le moment. De préférence je préfèrerais donc éviter de devoir coder dans un langage a côté, et donc pouvoir obtenir le résultat juste avec du sql (sinon php ou ruby ?) Table avec 4 champs utilisés pour cette requete : nom -> varchar (20) qte -> int (0 à 10 000 en gros) valeur1 -> int (0 à 1000) valeur2 -> int (0 à 1000) 1ere étape : quels sont les x premiers objets (12 par ex) ayant le cout "valeur1" le plus élevé ? ex : aaa 10 1000 12 bbb 5 250 15 ccc 3 500 17 résultat attendu : aaa 10 1000 12 ccc 2 500 17 2ème étape : pareil mais avec une règle en plus pour gérer les égalités : on priorise avec la valeur2 la plus grande en cas d'égalité ex : aaa 10 1000 12 bbb 5 250 15 ccc 3 500 17 ddd 4 500 21 résultat attendu : aaa 10 1000 12 ddd 2 500 21 3ème étape au cas où : si valeur1 et valeur2 sont identiques comment cela se passerait-il ? (je ne suis pas sûr que le cas soit possible mais bon Mon idée : de toute façon le champ d'index sur un texte est une "hérésie", il devrait donc y avoir un index numérique en auto-incrément, et je pense du coup appliquer la même solution mais avec cet index, en suivant la règle : on préfèrera l'article le plus récent, donc celui avec le plus haut index. Ou plus propre encore ajouter un index unique de "préférence" mais géré manuellement, qui donne l'ordre des produit. L'auto-incrément pourrait poser problème si on insère une valeur après coup. Merci encore :o) David |
|
|
00
|
|
|
#2 |
![]() ![]() |
Tu as un essai de requête à nous proposer ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() David Inscription : décembre 2010 Messages : 10 ![]() |
Non justement, ça fait quelques années que je ne touche plus trop à SQL sauf avec des requêtes basiques.
Je sais que j'ai vu ça il y a très longtemps, mais impossible de m'en souvenir, et j'avoue que j'ai du mal a trouver l'intitulé à rédiger pour une recherche google Je réfléchis à une solution avec des min/max d'un compte de valeurs et ajouter une clause sur cette variable, ce qui ferait une sorte de requête dynamique, mais je ne sais même pas si cela est toléré . Un petit kkechose comme Code :
2ème prob : avec ceci je ne peux pas trier sur les valeur1 et valeur2 |
||
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() David Inscription : décembre 2010 Messages : 10 ![]() |
Autre idée si cela est applicable en sql avec une table tempo
créer la table tempo pour "éclater les lignes avec qte > 1" du genre exploser mon aaa avec qte 10 en 10 lignes "aaa" ensuite requête basique avec order by et limit 12 :o) 1°) mais comment créer cette table ? 2°) optimisation, si on devrait compter des qte possibles jusqu'à 10 000 et de 20 à 100 items ... ca risque peut-être de faire lourd comme table tempo ? ----- L'autre algo simple mais avec programme aussi : select des lignes avec order by sur les champs valeurs et on incrémente une valeur dans une boucle jusqu'à ce que total > seuil. ----- SInon on m'a parlé de procédures stockées, mais là j'avoue, ce n'est pas dans mon cursus, et je ne connais pas les possibilités. |
|
|
00
|
|
|
#5 | ||||
|
Invité de passage
![]() David Inscription : décembre 2010 Messages : 10 ![]() |
Ho j'ai une autre idée si c'est possible
J'ajoute un champ total à ma table Je trie ma table par valeur1,valeur2,sort_id (croissant) <-- sort_id = index de préférence manuel (point 3) J'édite pour chaque ligne le champ total avec un sum des lignes ayant un ID <= a mon id courant ! et ensuite on doit pouvoir demander la ligne la plus petite étant supérieure à un seuil ! Code :
[edit] oui pas du tout ça en fait [/edit] Code :
|
||||
|
|
00
|
|
|
#6 | ||||||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
pour la 1/ Code sql :
pour la 2/ Code sql :
pour la 3/ si cela arrive, le SGBDR renverra... dans l'ordre qui lui convient le mieux, a toi donc de rajotuer une autre regle si tu en as besoin, par exemple pour trier par nom Code sql :
|
||||||
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() David Inscription : décembre 2010 Messages : 10 ![]() |
tes requetes vont me renvoyer les 12 premières lignes de la table, soit les 12 premiers noms de produits, pas la quantité.
-> regarde les exemples attendus. le 12 attendus correspond a 10 produits "aaa" + 2 produits "ccc" |
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
ok
j'avais mal compris la question, alors il faut faire Code sql :
|
||
|
|
00
|
|
|
#9 | ||
|
Invité de passage
![]() David Inscription : décembre 2010 Messages : 10 ![]() |
Je ne comprends toujours pas trop
Code :
tu change juste le tri, avec un calcul (qui me semble étrange en plus, je ne vois pas l'intérêt de multiplier la quantité par la valeur1 comme valeur de tri) le tri c'est les valeurs les plus chères en premier, ensuite, il faut limiter le nombre de produits (et non de lignes de produits) sur un seuil. |
||
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
???
Ca n'est pas ce que tu veux ? explique nous plus clairement, notamment, a quoi correspond cette table ? Citation:
Citation:
Je ne comprend pas non plus. D'ou sort ton 2 sur la deuxieme ligne de ton resultat attendu : |
||
|
|
00
|
|
|
#11 | ||
|
Invité de passage
![]() David Inscription : décembre 2010 Messages : 10 ![]() |
J'ai mis la structure de table :
Citation:
Citation:
Et re précision sur le besoin, la table comporte des lignes de produit, chaque produit, on en a une certaine quantité en stock (colonne "qte"). Tes requêtes vont me retourner 12 lignes de la table, soit 12 lignes de produits. Ma demande : je voudrait les 12 premiers "produits", pas de ligne produit. Ceci est montré dans le résultat attendu : 10 x le produit "aaa" et 2 x le produit "ccc" qui sont les 12 produits les plus chers de mon stock. Une autre idée si ce n'est pas clair, par exemple tu peux remplacer les "nom produit" par "nom du logiciel" et "qte" par "nb boites en stock". La question devient, quelles sont mes 12 boites de logiciels ayant la plus forte valeur. |
||
|
|
00
|
|
|
#12 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
ok, j'ai compris la subtilité (enfin je crois
est-ce que cette requete te donne ce que tu veux ? Code sql :
|
||
|
|
00
|
|
|
#13 | |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 529 ![]() |
Citons à nouveau Boileau, comme Cinephil l'affiche dans sa signature
Citation:
C'est bien ça ?
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() David Inscription : décembre 2010 Messages : 10 ![]() |
@Maljuna Kris : Oui par exemple.
En fait j'ai ce besoin pour plusieurs cas très différents, mais qui répondent à la même problématique. J'ai essayé de retranscrire un seul exemple pour simplifier mais je n'ai peut-être pas très bien réussi. Autre exemple : J'ai des documents, à chacun j'affecte un "poids", une note,... (qui sera calculé selon certains critères) qui reflète son importance. Ensuite je voudrais connaître les 100 documents les plus importants pour les sauvegarder de manière différente. Autre exemple sur un jeu : Quelles sont mes 100 meilleures unités, tous types confondus. |
|
|
00
|
|
|
#15 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 529 ![]() |
Ça sent le besoin de récursivité, or MySQL et la récursivité....
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#16 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
La requete que j'ai postée plus haut fonctionne sous MSSQL, j'ai remplacé les COALESCE par des IFNULL pour que ca passe sous MySQL (il y a peut être d'autre détails de syntaxe a corriger, je n'ai pas de MySQL sous la main, et je le connais trop peu), et il n'y a pas de récursivité.
en soit elle est simple : je calcul pour chaque article le la somme des article "mieux classé" (valeur1 plus grande, ou valeur1 égale et valeur2 plus grande) si cette somme + la quantité de l'article en question est inférieure a 12, alors l'article entre complètement dans le critère de sélection. Il n'y a que pour le dernier article que ca se complique un peu, car il faut calculer le delta entre la quantité dudit article, et la quantité totale voulue (ici, 12) c'est le but de l'UNION dans ma requete (la deuxième requete après l'UNION ne sert qu'a ajouter l'article dont on ne prend pas la quantité totale). cependant, on doit pouvoir faire mieux (genre avec un simple CASE, mais je ne sais pas si ca sera vraiment mieux niveau perf) |
|
|
00
|
|
|
#17 | |
![]() ![]() |
Citation:
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
|
00
|
|
|
#18 |
|
Invité de passage
![]() David Inscription : décembre 2010 Messages : 10 ![]() |
@aieeeuuuuu
Bon j'ai testé, ça fonctionne ! Merci beaucoup J'ai fais les cas avec 1 seul articles, plusieurs, cas d'égalités,... Note : j'ai juste corrigé quelques "S2" en "s2". Par contre j'avoue ne pas avoir vu encore ce IFNULL, je vais aller voir les tutos Petite question annexe, peut-on paramétrer la quantité pour ne la saisir qu'une fois ? Ou sinon est-il possible de rajouter une table "param" avec un champ de critere, et ajouter ce champ dans la requête, même si cette table n'aura pas de liaison "relationnelle" avec les tables de données ? David |
|
|
00
|
|
|
#19 |
![]() ![]() |
COALESCE est plus respectueux de la norme SQL que IFNULL qui est je crois spécifique à MySQL. Il vaut mieux connaître COALESCE que tu pourras utiliser aussi quand tu seras confronté à un autre SGBD.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
Copyright © 2000-2012 - www.developpez.com