Un ORDER BY pas complètement RAND

Avatar du membre
Eléphant du PHP | 174 Messages

08 mars 2020, 07:04

Pic Poc ! Hellooo !

Qu'est-ce qu'il nous pond encore le canard ?

Bah voilà, j'ai un petit utilitaire qui me permet de préparer mes playlists pour mes lives le dimanche soir.
Cet outil me permet de faire une recherche avancée parmi les titres que j'ai déjà rentré en base de données par les lives précédents.
La base de données a plusieurs colonnes, notamment le titre, le BPM (le tempo musical), la durée et la date de playlist dans laquelle le titre a été joué.

J'ai au choix la possibilité d'afficher par titre ascendant et date de playlist descendante :

Code : Tout sélectionner

SELECT * FROM playlist WHERE LOWER(titre) LIKE '%boy%' AND bac LIKE '%Dance%' AND bpm >= '130' AND bpm <= '136' ORDER BY UPPER(titre) ASC, datepl DESC
(Bien sur dans cet exemple je borne un peu le BPM pour sortir des résultats pertinent a à la question)

Voici les résultats correspondants à cette requête :
740 Boys - Shimmy Shake (130.0 - 05:55) (2018-04-29)
Cometz - Scooby Dooby Boy (135.0 - 05:29) (2019-02-10)
Cometz - Scooby Dooby Boy (135.0 - 05:29) (2017-11-05)
Cow Boy - Is Not Stuppeed (134.6 - 04:48) (2017-07-30)
Digital Boy - Crossover (136.0 - 05:30) (2018-08-26)
Masterboy - I Got To Give It Up (133.6 - 06:01) (2020-02-23)
Masterboy - I Got To Give It Up (133.6 - 06:01) (2018-10-14)
Masterboy - I Got To Give It Up (133.6 - 06:01) (2017-10-29)
Two Boys - Don't You Know (135.1 - __:__) (2019-12-15)
On remarque que 2 titres ont été joués dans plusieurs playlists

Ou bien, d'afficher par ordre aléatoire pour pouvoir choisir un titre à mettre sans être influencé par l'ordre alphabétique :

Code : Tout sélectionner

SELECT * FROM playlist WHERE LOWER(titre) LIKE '%boy%' AND bac LIKE '%Dance%' AND bpm >= '130' AND bpm <= '136' ORDER BY RAND()
Voici un exemple de résultats :
Digital Boy - Crossover (136.0 - 05:30) (2018-08-26)
Cometz - Scooby Dooby Boy (135.0 - 05:29) (2019-02-10)
740 Boys - Shimmy Shake (130.0 - 05:55) (2018-04-29)
Masterboy - I Got To Give It Up (133.6 - 06:01) (2017-10-29)
Cometz - Scooby Dooby Boy (135.0 - 05:29) (2017-11-05)
Masterboy - I Got To Give It Up (133.6 - 06:01) (2020-02-23)
Two Boys - Don't You Know (135.1 - __:__) (2019-12-15)
Masterboy - I Got To Give It Up (133.6 - 06:01) (2018-10-14)
Cow Boy - Is Not Stuppeed (134.6 - 04:48) (2017-07-30)
Les titres sont bien mélangés. Mais j’aimerais que les titres joués plusieurs fois restent contigus (et si ils sont en plus classés par date décroissante c'est encore mieux lol).

Par exemple :
Digital Boy - Crossover (136.0 - 05:30) (2018-08-26)
Masterboy - I Got To Give It Up (133.6 - 06:01) (2017-10-29)
Masterboy - I Got To Give It Up (133.6 - 06:01) (2018-10-14)
Masterboy - I Got To Give It Up (133.6 - 06:01) (2020-02-23)
740 Boys - Shimmy Shake (130.0 - 05:55) (2018-04-29)
Two Boys - Don't You Know (135.1 - __:__) (2019-12-15)
Cometz - Scooby Dooby Boy (135.0 - 05:29) (2019-02-10)
Cometz - Scooby Dooby Boy (135.0 - 05:29) (2017-11-05)
Cow Boy - Is Not Stuppeed (134.6 - 04:48) (2017-07-30)
L'idée étant d'avoir une liste de titres aléatoire tout en les regroupant pour savoir combien de fois je les ai joués et voir de suite quelle est parmi ces fois là, laquelle est la plus récente (donc idéalement première ligne dans le cas d'un titre joué plusieurs fois).

Alors j'ai tenté un GROUP BY titre mais évidement il n'y a plus qu'une ligne par titre, même si joué plusieurs fois.
Un ORDER BY RAND(), titre ASC ne fait rien de plus ni de mieux que l'ORDER BY RAND() seul.

La question est d'abord de savoir si c'est faisable dans une requête (et la question bonus serait de savoir comment :P ) , ou bien si je dois faire une première requête pour liste les titres différents, et dans le while de cette requête, faire une autre requête pour sortir toutes les lignes correspondantes à chaque titre du while.

Merkouin :D
Le Canard
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen: