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

Fermé
FlyAwayExpert7 Messages postés 70 Date d'inscription vendredi 26 décembre 2014 Statut Membre Dernière intervention 14 novembre 2016 - 6 nov. 2016 à 15:47
yg_be Messages postés 23317 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 10 novembre 2024 - 17 nov. 2016 à 23:20
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 40437 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 10 novembre 2024 9 419
Modifié par jee pee le 6/11/2016 à 15:58
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 vendredi 26 décembre 2014 Statut Membre Dernière intervention 14 novembre 2016 3
14 nov. 2016 à 05:55
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 23317 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 10 novembre 2024 Ambassadeur 1 552
17 nov. 2016 à 23:20
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