Requête MYSQL trop lourde !!!

Petit nouveau ! | 4 Messages

14 févr. 2010, 16:06

Bonjour,
D'abord j'en profite pour me présenter car je suis nouveau sur le forum.
Ensuite j'ai un souci avec un requête SQL. Voila mon problème :
J'ai un module de recherche dans mon site avec de nombreux critères, chaque critère proposant des choix multiples.
Je commence donc par écrire ma requête comme çela :
$sql.=" SELECT entreprises.raison_sociale, etc ... FROM entreprises, acheteurs, operations, gammes_produit, perimetres_action, perimetres_entreprises, types_prestation, prestations_entreprises, gammes_operations WHERE gammes_produit.id_gamme=gammes_operations.id_gamme AND 
gammes_operations.id_operation=operations.id_operation AND
[...]
";
Et je la complète dynamiquement avec une boucle en php, comme ça :
//Si des périmetres sont selectionnés
if(($_SESSION['choix_perimetres'])!="")
{
foreach($_SESSION['choix_perimetres'] as $cle=>$valeur) 
    { 
	if($cle!=0)
	$sql.="OR ";
	else
	$sql.="AND ( ";
	
	$sql.="perimetres_action.nom_perimetre_action='$valeur'
	";
    
    } 
$sql.=") ";
}
Et je fait ça pour chacun des critères.
Le problème est qu'au dela de plus d'environ 80 critères sélectionnés, MYSQL ne retourne plus rien !!!!!!
Il y a une astuce pour résoudre mon problème ?

Merci d'avance pour votre aide.
A bientôt.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

14 févr. 2010, 16:33

Si ce sont à chaque fois les différentes valeurs possibles pour ton champ nom_perimetre_action, tu peux utiliser un IN(). Celui-ci est limité à 1000 valeurs, mais ça devrait te laisser un peu de marge :
AND nom_perimetre_action IN (valeur1, valeur2, ...)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 4 Messages

16 févr. 2010, 20:24

Super je vais essayé ça !
Merci pour ta réponse.
A bientôt.

ViPHP
ViPHP | 5462 Messages

16 févr. 2010, 21:07

tu peux utiliser un IN(). Celui-ci est limité à 1000 valeurs, mais ça devrait te laisser un peu de marge
on a discuter de ca sur un autre topic, il a pas vu ou c'était marquer, en parallèle j'ai fais des test il me semblait pas y a voir de limite. si ta plus d'info :wink:

ViPHP
ViPHP | 1024 Messages

16 févr. 2010, 22:21

tu peux utiliser un IN(). Celui-ci est limité à 1000 valeurs, mais ça devrait te laisser un peu de marge
on a discuter de ca sur un autre topic, il a pas vu ou c'était marquer, en parallèle j'ai fais des test il me semblait pas y a voir de limite. si ta plus d'info :wink:
On peut contourner cette limite facilement.

Lastuce c'est de faire :
WHERE
(
 nom_perimetre_action IN (valeur1, valeur2, ...,valeur1000)
OR 
 nom_perimetre_action IN (valeur1001, valeur1002, ...,valeur2000)
[OR ...]
)
AND
// autres critères
A+

Pascal

ViPHP
ViPHP | 5462 Messages

16 févr. 2010, 22:37

justement vous avez vus ou que y'a une limite, parce que moi j'en passe 15000 et ca marche ? :shock:

ViPHP
AB
ViPHP | 5818 Messages

17 févr. 2010, 00:28

justement vous avez vus ou que y'a une limite, parce que moi j'en passe 15000 et ca marche ? :shock:
La différence vient sans doute des nouvelles versions qui ont évoluées...

J'ai déjà été confronté à un problème assez similaire (évolution des capacités de traitement) précédemment et j'ai eu toutes les peines du monde pour savoir à partir de quelle version ça avait évolué...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 févr. 2010, 23:37

C'est peut être bien lié à la version et les évolutions des produits ont très bien pu corriger le problème. C'est vrai que j'ai été confronté à ce problème il y a longtemps et que je l'ai considéré comme un acquis :) (de mémoire j'avais eu le même soucis sous oracle, ce qui a pu également me conforter dans cette voie :))

A noter que le problème apparaissait uniquement lorsque je spécifiais les valeurs "manuellement" dans le IN. Avec une sous-requête qui me retournait 10.000 enregistrements, il n'y avait aucun problème :)

Après la question que l'on peut se poser, c'est s'il n'y a pas moyen d'optimiser (tant techniquement que fonctionnellement) un code qui pourrait nécessiter la saisie de plus de 1000 valeurs ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 4 Messages

19 févr. 2010, 17:03

C'est bon ça marche !!!
Je sais pas pourquoi ça ne fonctionnait pas chez moi, je travaille avec wamp et ma version de MySQL est 1.3.2.27.
Mais bon c'est de l'histoire ancienne maintenant...
Merci encore pour votre aide.
Au prochain post !

PS : Et désolé si j'ai pas réussi à trouver la réponse sur un vieux topic... =)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 févr. 2010, 17:13

Modération :
Afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 4 Messages

21 févr. 2010, 20:29

Bien reçu pour la mise en place du code, j'avais pas remarqué les balises désolé.
Mon prochain post sera parfait ! =)