[RESOLU] SQL tri multiple et aléatoire

WRInaute occasionnel
Salut,

J'ai un petit souci.

Je veux avec SQL afficher les résultats d'une requête de la manière suivante :

- Les 10 valeurs d'un champ avec un tri décroissant sur le champ date_up (timestamp avec valeurs en secondes de 1970)
- Afficher le résultat dans un ordre aléatoire

Je sais parfaitement trier ces deux individuellement ORDER BY date_up DESC ou ORDER BY RAND() [...] LIMIT 10

Mais comment faire pour récupérer les 10 valeurs les plus récentes et afficher le résultat de manière aléatoire ?

J'ai essayé avec suffle de php, de combiner les requetes en SQL mais je n'arrive pas au résultat escompté.

Merci de votre aide si quelqu'un connait l'astuce.
 
WRInaute occasionnel
Re: SQL tri multiple et aléatoire

Salut,

Merci, mais c'est pas ça.

Je veux récupérer les 10 plus récents, et ensuite les afficher de manière aléatoire dans un nuage de tags.

Je ne veux pas que le choix soit aléatoire, mais uniquement l'ordre d'affichage, c'est là le problème.
 
WRInaute accro
Re: SQL tri multiple et aléatoire

Il y a la fonction shuffle en php. Tu dis toi même que c'est l'affichage que tu veux modifier, alors je vois pas pourquoi tu cherches sur une requête mysql. Si on réfléchit comme ça, tu veux pas non plus que ta requête te génère ton template et que le résultat soit ton site lol
 
WRInaute occasionnel
Re: SQL tri multiple et aléatoire

Non je veux pas que la requete soit un template, merci bcp de ton aide...

Avec suffle, je ne suis pas parvenu à rendre aléatoire le résultat de la requête dans la boucle while, je dois mal l'utiliser.

D'où mon post, avec comme éventualité de pouvoir traiter ça directement avec SQL, ce dont je doute.

Donc si quelqu'un sait comment utiliser suffle avec mysql_fetch_array dans une boucle while, je suis preneur.

Merci
 
WRInaute passionné
Re: SQL tri multiple et aléatoire

Pour la commande shuffle il faut utiliser un tableau..
ton mysql_fetch_array te donne un tableau...
normalement pas besoin de while...
 
WRInaute accro
Re: SQL tri multiple et aléatoire

Code:
ORDER BY date DESC LIMIT 10, RAND()

ou en passant par un trie aleatoire

la requete
Code:
ORDER BY date LIMIT 10

le php (pas tester, brut de brut : )

Code:
$q_q = mysql_query("SELECT *  FROM table ORDER BY date LIMIT 10", $link) or die(mysql_error($link));
    while (($r_r = mysql_fetch_array($q_q)) !== false) {
             $tab[]  = $r_r ['nomduchamp']; }

// melange
srand((float)microtime() * 1000000);
shuffle($tab);

// print
print_r($tab);
 
WRInaute occasionnel
Re: SQL tri multiple et aléatoire

ORDER BY date DESC LIMIT 10, RAND() génère une erreur

J'ai utilisé suffle en m'inspirant de ton exemple, je l'utilisais mal, c'est pour ça que je n'arrivais pas à ce que je voulais.

Merci de ton aide.
 
WRInaute accro
Et la "vraie" solution en SQL:

Code:
select * from (select * from table order by date desc limit 10) s order by rand()
Jacques.
 
WRInaute accro
jcaron a dit:
Et la "vraie" solution en SQL:

Code:
select * from (select * from table order by date desc limit 10) s order by rand()
Jacques.
joli effet de style. :D
Je pense que je risque de l'utiliser dans ce type de cas, car j'utilisais la solution sql + shuffle pour faire ça
 
WRInaute accro
antinomx a dit:
Mountain Magazin a dit:
Quelle est la solution la plus économe en terme de ressource d'après vous ?

Le Tout SQL ou SQL puis shuffle ?

C'est clairement la solution SQL puis shuffle...

Tu as fait le test? Parce que moi j'aurais tendance à dire "kif kif pareil", je ne vois pas bien la différence.

En fait si, la "bonne" version en SQL serait plutôt:

Code:
select * from (select *,rand() as tmp_rand from table order by date desc limit 10) s order by tmp_rand

(ça ne fait qu'un appel à rand() par ligne, soit en moyenne 2.3 fois moins).

Evidemment si le serveur SQL et le serveur www ne sont pas sur la même machine, et suivant qu'on veuille privilégier l'une plutôt que l'autre, on peut préférer l'une à l'autre. En général on préfère "charger" le serveur www plutôt que le serveur de BDD (plus facile de faire du load balancing entre des www qu'entre des bdd). Mais dans le cas où on a une seule machine avec SQL et www, je serais surpris qu'il y ait un gros écart. Je me trompe?

Jacques.
 
WRInaute occasionnel
Moi je lis avec attention la discussion, mais j'en ai aucune idée.

Je serais tenté de dire que la solution SQL + php est plus économe, parce qu'on ne fait qu'une requête simple sur la base, et puis un petit traitement php avec foreach pour afficher les résultats.

Dans mon cas, je n'affiche que 15 ou 20 items, ce n'est pas comme si j'en retirai des centaines ou des milliers de la BDD sur une page fréquentée, auquel cas, je me poserais plus sérieusement la question.

Mais bon, ce code sera sur toutes les pages tout de même donc j'essaie de faire gaffe...

En tout cas, merci encore de votre aide.
 
WRInaute occasionnel
jcaron a dit:
Tu as fait le test? Parce que moi j'aurais tendance à dire "kif kif pareil", je ne vois pas bien la différence.

En fait si, la "bonne" version en SQL serait plutôt:

Code:
select * from (select *,rand() as tmp_rand from table order by date desc limit 10) s order by tmp_rand

(ça ne fait qu'un appel à rand() par ligne, soit en moyenne 2.3 fois moins).

Evidemment si le serveur SQL et le serveur www ne sont pas sur la même machine, et suivant qu'on veuille privilégier l'une plutôt que l'autre, on peut préférer l'une à l'autre. En général on préfère "charger" le serveur www plutôt que le serveur de BDD (plus facile de faire du load balancing entre des www qu'entre des bdd). Mais dans le cas où on a une seule machine avec SQL et www, je serais surpris qu'il y ait un gros écart. Je me trompe?

Jacques.

Tu as tout dis :) Niveau performance c'est sur que ça doit pas être loin d'être identique (quoique faudrait faire un test précis) mais en terme de ressources...
Et puis "on" m'a toujours dit "économise ton serveur sql !", c'est déjà assez facilement en rade...

Et puis même si il fallait afficher plusieurs centaines de résultats je choisirai cette option, après tout est question de goût !

A+!
 
Discussions similaires
Haut