|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre habitué
![]() Serge Inscription : octobre 2004 Messages : 333 ![]() |
Bonjour,
Je vous donne un modèle simplifié de ce que j'ai, mais c'est pour être plus clair dans l'explication. J'ai une table A : Code :
Maintenant, je veux sortir un résultat du genre : Code :
SELECT '1-2-3-4-5', COUNT(Combinaison) NB, MIN(Valeur) MINIMUM, COUNT( * )*AVG( Valeur ) FROM A WHERE Combinaison IN ('1-2-3-4', '1-2-3-5, '1-2-4-5', '1-3.-4-5', '2-3-4-5') Avec deux requêtes : Code :
Mon problème, c'est que j'arrive en fait à plusieurs milliers de requêtes à mettre en UNION. Et là, vous vous en doutez, mysql dit stop : Out of resources when opening file A. Y a-t-il une solution avec MySQL ? Sinon, comme je suis en php, je pense mettre le résultat de chaque requête dans une ligne d'un tableau que je trierai ensuite. |
||||
|
|
00
|
|
|
#2 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
UNION fait un DISTINCT, UNION ALL est plus approprié.
Quel est le résultat souhaité ? Dans le IN tu places la totalité des combinaisons de 4 chiffres ? Tu t'es trompé à priori en utilisant '1-2-3-4-5' dans le SELECT, il faudrait mieux expliquer la relation entre la combinaison sélectionnée en dur dans le SELECT et la liste à placer dans le IN. Citation:
|
|
|
|
00
|
|
|
#3 | |
|
Membre habitué
![]() Serge Inscription : octobre 2004 Messages : 333 ![]() |
Citation:
Donc pour '1-2-3-4-5', j'aurai dans le IN '1-2-3-4', '1-2-3-5', 1-2-4-5', '1-3-4-5', '2-3-4-5' pour '1-2-3-4-6', j'aurai dans le IN '1-2-3-4', '1-2-3-6', 1-2-4-6', '1-3-4-6', '2-3-4-6' etc... (j'ai mis à jour mon premier post où le IN était incorrect) |
|
|
|
00
|
|
|
#4 | ||||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Qu'est ce que ça donne avec UNIONN ALL ? Mais je n'attends pas de miracle sur plus de 1000 UNION ALL...
As tu la possibilité de faire évoluer ton schéma ? Si oui créer une table contenant la totalité des combinaisons sur 5 chiffres et une table associant les cominaisons sur 5 chiffres et les combinaisons sur 4 chiffres permettrait de faire des jointures à la place des 1000+ UNION Ci -dessous les tables en questions, je les ai créées sur oracle (en virant juste le from dual spécifique à oracle) donc à l'erreur de syntaxe près (j'espère que ça passe) Code :
Code :
J'espère que la colonne combinaison dans ton exemple est unique (et toujours correctement triée). Sinon les résultats des count(*) notamment seront à adapter, peut être avec des DISTINCT, à vérifier... Peux tu faire un test sur quelques combinaisons et donner ton retour stp ? Evidemment pour faire plus propre il faut des PK/FK, peut être avec un ID auto incrémenté. |
||||
|
|
00
|
|
|
#5 | ||||||
|
Membre habitué
![]() Serge Inscription : octobre 2004 Messages : 333 ![]() |
L'idée de créer en base les tables avec toutes les combinaisons possibles est effectivement une très bonne solution.
![]() J'ai créé 3 tables : COMB_P_N --------1,n-------- CONTIENT --------1,n-------- COMB_4_P Dans COMB_P_N, il y a les combinaisons : de 5 parmi 10, 5 parmi 11, ... 5 parmi 22 (1-2-3-4-5, 1-2-3-4-6, ..., 18-19-20-21-22) de 6 parmi 10, 6 parmi 11, ... 6 parmi 22 (1-2-3-4-5-6, 1-2-3-4-7, ..., 17-18-19-20-21-22) de 7 parmi 10, 7 parmi 11, ... 7 parmi 22 (1-2-3-4-5-6-7, 1-2-3-4-6-8, ..., 17-18-19-20-21-22) (au total, 271 491 combinaisons) Dans COMB_4_P, il y a les combinaisons de 4 parmi 22 (1-2-3-4, 1-2-3-5, ..., 19-20-21-22) (au total, 7 315 combinaisons) Dans CONTIENT, on fait le lien entre les deux tables : pour 1-2-3-4-5 dans COMB_P_N, on a 1-2-3-4, 1-2-3-5, 1-2-4-5, 1-3-4-5 et 2-3-4-5 dans COMB_4_P Dans CONTIENT, il y a 7 219 905 enregistrements. Code :
Par exemple, si je veux faire une requête portant sur les combinaisons de 5 parmi 10 jusqu'à 5 parmi 16 : Code :
Code :
|
||||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com