IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Selection aléatoire dans une fouchette de 10%


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 8
    Points : 10
    Points
    10
    Par défaut Selection aléatoire dans une fouchette de 10%
    Bonjours à tous !

    Voilà, j'ai un souci sur la construction d'une requête pour choisir une image aléatoire
    En gros, j'ai 2 tables, une stockant des images (POTD composé de NPOTD et URLMini) et une stockant les parutions (POTDParJours composé de NPOTD et DateParution).

    Le scipt à la base vérifie si pour le jours j'ai déjà une "Picture Of The Day" est déjà parametrée.
    Si ce n'est pas le cas, il vérifie combien de POTD n'ont jamais été parut. Si y'en as qu'un, il le sélectionne et le paramètre pour la journée, s'il y en a plusieur, il en prend un au hazard et le paramètre pour la journée...

    Au moment de mettre ma requête en branle, j'en suis dans le cas où toutes les images on étaient parut au moins une fois et qu'il faut faire le choix sur l'image à afficher...

    Donc :p !
    A ce moment là j'ai un $Nb10Pourcent qui est un entier qui me représente l'arondie du 10% du nombre d'images.
    Et je souhaiterai avoir une requête qui me selectionne une image aléatoire de ma table POTD fesant partie de la fourchette des 10% les moins paru...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(POTDparJours.NPOTD) as countNPOTD, POTD.NPOTD as NPOTD
    FROM POTD LEFT JOIN POTDparJours ON POTD.NPOTD = POTDparJours.NPOTD
    GROUP BY POTD.NPOTD
    ORDER BY countNPOTD LIMIT Rand(), $Nb10Pourcent;
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 466
    Points : 15 850
    Points
    15 850
    Par défaut
    si la requete t'envoye déjà ce que tu veux et bien trié (les moins paru en 1er) il y a juste à changer le "LIMIT"
    en PHP cherche un nombre aléatoire entre 0 et $Nb10Pourcent et ensuite fait ca :

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Merci bien ! J'avais pas pensé à une solution de ce genre... du coup, j'en suis arrivé à ça et c plutot pas mal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $CountPOTD = mysql_query("SELECT * FROM POTD");
    $NbPOTD = mysql_num_rows($CountPOTD);
     
    $Nb20Pourcent = round($NbPOTD/5);
    $nbAle = rand(0, $Nb20Pourcent);
    $SQLSelectMonNewPOTD = "SELECT count(POTDparJours.NPOTD) as countNPOTD, POTD.NPOTD as NPOTD, POTD.URLMin as URLMin, POTD.LibPOTD as LibPOTD
    			FROM POTD LEFT JOIN POTDparJours ON POTD.NPOTD = POTDparJours.NPOTD
    			GROUP BY POTD.NPOTD
    			ORDER BY countNPOTD LIMIT ".$nbAle.", 1";

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 466
    Points : 15 850
    Points
    15 850
    Par défaut
    je me permets de te conseiller 2 trucs :
    - pour compter le nombe d'enregistrements utilise la fonction MySQL "COUNT" comme ca le résultat de la requete sera directement le résultat que tu veux et tu n'auras pas besoins de faire circuler sur le réseaux le contenu entier de la table (surtout qu'il n'est plus utilisé ensuite)
    - utilise la fonction mysql_eror() quand tu exécute une requete comme ca tu sais tout de suite pourquoi ta requete ne fonctionne puisque tu auras un joli message d'erreur

    avec ces 2 corrections ca donne ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $CountPOTD = mysql_query('SELECT COUNT(*) FROM POTD') or exit(mysql_error());
    $NbPOTD = mysql_fetch_array($CountPOTD);
    $NbPOTD = $NbPOTD['COUNT(*)'];

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    C'est noté... en te remerciant... c vrai qu'en étant autodidacte, j'ai pas encore eu le temps de me pencher sur la gestion de mes erreurs proprement... mais ça viens... ça viens :p

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Nombre aléatoire dans une chaine
    Par Premium dans le forum C
    Réponses: 14
    Dernier message: 24/05/2006, 15h02
  2. Tirage aléatoire dans une base donnée
    Par leloup84 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 30/01/2006, 17h13
  3. Sélectionner 5 tuples aléatoirement dans une table
    Par subhuman dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/11/2005, 16h18
  4. Réponses: 4
    Dernier message: 24/08/2005, 17h01
  5. [FLASH MX] Choisir un nombre aléatoire dans une liste
    Par grenatdu55 dans le forum Flash
    Réponses: 4
    Dernier message: 23/04/2005, 22h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo