Sélection aléatoire avec "poids" et conditions

FlyAwayExpert7 Messages postés 70 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,
j'essaye de pouvoir sélectionner dans ma BDD un ROW au hasard mais avec un pourcentage de chance (power).
Dans cette requête l'on doit pouvoir vérifier si cette offre est disponible dans le pays du visiteur (le %NNAA% servirait à pouvoir en bdd le symboliser comme tout les pays/continent).

Ce code FONCTIONNE, mais... pas entièrement:
l'aléatoire est super, mais les autres conditions ne fonctionnent pas, pourquoi ? Il ne me retourne aucune erreur...

$select_ad = $DB->prepare("SELECT RAND()*power as tirage,id FROM campagnes WHERE 
          country_disp LIKE :visitor_country OR country_disp LIKE '%NNAA%' AND 
          continent_disp LIKE :visitor_continent OR continent_disp LIKE '%NNAA%' AND 
          :taille <> '' OR LW LIKE 'TRUE' AND   
          actif LIKE 'TRUE' ORDER BY tirage DESC LIMIT 1");

$select_ad->execute(array(
	':visitor_country' => "'%".$get_info_wip['country_code']."%'",
	':taille' => $verifad_fetch['size'],
	':visitor_continent' => "'%".$get_info_wip['continent_code']."%'"
));

$first_random = $select_ad->fetch();


D'avance merci,

Pierre

-----------------------------------------------
Conception web · Développement web · Design graphique par passion.

3 réponses

jee pee Messages postés 41503 Date d'inscription   Statut Modérateur Dernière intervention   9 712
 
Bonjour,

Une suggestion, dans ta requête tu devrais mette des parenthèses pour gérer explicitement l'ordre des critères. Car lors de l’exécution de la requête les différents opérateurs <> or and like sont traités dans un ordre bien précis, par rapport à leur priorité pour mysql, qui ne correspond pas nécessairement à ce que tu souhaites avoir.

cdlt

        un étranger, c'est un ami qu'on n'a pas encore rencontré.
1
FlyAwayExpert7 Messages postés 70 Date d'inscription   Statut Membre Dernière intervention   3
 
Bonjour,
merci de ta rapide réponse, toute fois je ne la comprend pas trop quoi faire, je me suis documenté à l'aide d'internet, et rien qui change, malgré mes minis modifications...

$select_ad = $DB->prepare("SELECT RAND()*power as tirage,id FROM campagnes WHERE 
          (country_disp LIKE :visitor_country OR country_disp LIKE ('%NNAA%')) AND 
          (continent_disp LIKE :visitor_continent OR continent_disp LIKE ('%NNAA%')) AND 
          :taille <> '' OR LW LIKE 'TRUE' AND   
          actif LIKE 'TRUE' ORDER BY tirage DESC LIMIT 1");


-----------------------------------------------
Conception web · Développement web · Design graphique par passion.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
Quelques suggestions :
- explique ce qui ne fonctionne pas, ce que tu voudrais obtenir et ce que tu obtiens
- explique ce que tu essaies de faire avec '%NNAA%'. je pense que ce que tu fais avec cela n'a aucun sens
- réfléchi à l'utilisation des multiples "like" dans ta requête
- comprends ce que tu essaies de faire avec :taille dans ta requête
- comprends et applique la suggestion de jee pee, donc ajouter des parenthèses dans le texte suivant :
(country_disp LIKE :visitor_country OR country_disp LIKE ('%NNAA%')) AND 
          (continent_disp LIKE :visitor_continent OR continent_disp LIKE ('%NNAA%')) AND 
          :taille <> '' OR LW LIKE 'TRUE' AND   
          actif LIKE 'TRUE'
0