Page 1 sur 1

Requête par ordre aléartoire puis ordonnée

Posté : 24 oct. 2011, 11:38
par Ehplod
Salut,

J'ai une table dans laquelle je pioche des lignes en fonction de leur date.
!!! Attention, pour des raisons techniques (que je ne peux changer), les dates ne sont pas au format sql, j'ai une colonne pour les années, une pour les mois et une pour les jours.
Je veux les afficher par ordre chronologique (mois et jour) ( ASC)
Je me limite à 5 lignes.

Je ne veux pas que se soit tout le temps les même, soit les 5 première dates.

Je veux donc en piocher 5 aléatoirement, puis les afficher par ordre chrono.

Voilà ou j'en suis.
SELECT MaLigne
FROM MaTable
WHERE MonMois = ce mois && MonJour = ce jour
ORDER BY MonMois ASC, MonMois ASC
LIMIT 5";
Là, je récupère les 5 première dates.

Si j'utilise Rand()
SELECT MaLigne
FROM MaTable
WHERE MonMois = ce mois && MonJour = ce jour
ORDER BY Rand()
LIMIT 5";
Là, je récupère bien 5 lignes au hasard, mais elle ne sont plus ordonné par date.

Ceci ne fonctionne pas :
ORDER BY Rand(), MonMois ASC, MonMois ASC
Merci du coup de pouce.

Re: Requête par ordre aléartoire puis ordonnée

Posté : 24 oct. 2011, 13:53
par Cyrano
Salut,
Essaye avec une sous-requête, comme ceci :
SELECT MaLigne
FROM MaTable
WHERE id IN(
  SELECT id FROM MaTable ORDER BY RAND() LIMIT 0, 5
) AND MonMois = ce mois
  AND MonJour = ce jour
ORDER BY MonMois ASC, MonMois ASC;
La sous-requête sélectionne cinq identifiants au hasard et la requête principale va trier chronologiquement.

Re: Requête par ordre aléartoire puis ordonnée

Posté : 24 oct. 2011, 14:46
par Ehplod
Idée intéressante... mais ca ne fonctionne pas
"This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'"

je vais tout de même regarder dans cette direction.

Re: Requête par ordre aléartoire puis ordonnée

Posté : 24 oct. 2011, 14:52
par Cyrano
Alors déplace la clause LIMIT vers la requête principale, ça devrait fonctionner.

Re: Requête par ordre aléartoire puis ordonnée

Posté : 24 oct. 2011, 15:06
par Ehplod
Pas possible.
Si je met le limit sur la requête principal, il me prendra toujours les même 5 premières dates.

Re: Requête par ordre aléartoire puis ordonnée

Posté : 24 oct. 2011, 15:13
par Cyrano
Logique effectivement puisque toutes les clés seront présentes dans le retour de la sous-requête.

Dans ce cas, ton choix est limité : récupérer les cinq lignes aléatoires comme tu faisais, mais ensuite trier par ordre chronologique par programmation.

Je vois bien une idée à explorer, mais je ne sais pas si ce serait une solution valable : créer une vue qui aurait une clause LIMIT à 5 : et dans ce cas la sous-requête devrait pointer sur la vue.

Re: Requête par ordre aléartoire puis ordonnée

Posté : 24 oct. 2011, 15:19
par Ehplod
J'ai bien trouvé ça :http://blog.developpez.com/james-poulso ... -sous-req/

Mais ce semble pas fonctionner dans mon cas.
Y a plus d'erreur, mais je ne reçois plus les données aléatoires.

Certainement que je ne gère pas correctement l'alias.

Re: Requête par ordre aléartoire puis ordonnée

Posté : 24 oct. 2011, 15:23
par Cyrano
AStucieux comme méthode, maintenant si tu n'as pas de résultats, ça dépend peut-être de ton implémentation ?

Ça devrait ressembler à ça :
SELECT MaLigne
FROM MaTable
WHERE id IN(
  SELECT * FROM (
    SELECT id 
    FROM MaTable
    WHERE MonMois = ce mois
      AND MonJour = ce jour
    ORDER BY RAND()
    LIMIT 0, 5
  ) AS ids
)
ORDER BY MonMois ASC, MonMois ASC;

Re: Requête par ordre aléartoire puis ordonnée

Posté : 24 oct. 2011, 15:42
par Ehplod
C'est tout bon, je me plantaisdans mes AND.

Merci

Re: Requête par ordre aléartoire puis ordonnée

Posté : 25 oct. 2011, 09:18
par Mazarini
Il y a quelque chose que j'ai du mal à comprendre. La sélection se fait sur le mois et et le jour et le tri se fait sur les même critère. Si les lignes ont toutes le même mois et le même jour, comment les trier sur le mois et le jour ? Ou plutôt comment peuvent elles ne pas être triées ?

Re: Requête par ordre aléartoire puis ordonnée

Posté : 25 oct. 2011, 09:28
par Cyrano
Je ne m'étais pas arrêté sur ce détail mais effectivement, la clause ORDER BY dans ce dernier cas n'a aucun intérêt et pourrait carrément être supprimée puisqu'on sait que toutes les lignes retournées auront le même mois et le même jour.

En fait soit on récupère des données pour une date donnée et on a plus besoin de la clause ORDER BY, soit on vire la clause WHERE sur les dates de la sous-requête et on laisse l'ORDER BY pour le tri chronologique puisque là on aura pas forcément des lignes de la même date.

Re: Requête par ordre aléartoire puis ordonnée

Posté : 25 oct. 2011, 15:07
par Ehplod
Hop, hop, hop... Arrêtez de surchauffer votre cerveau... :mrgreen:

C'est (encore) une coquille...
Dans le sujet, il fallait lire dans la close where :
WHERE MonMois <= ce mois && MonJour <= ce jour
et non
WHERE MonMois = ce mois && MonJour = ce jour