Requète avec WHERE d'une valeur de sous requète

Avatar du membre
Eléphant du PHP | 218 Messages

13 août 2021, 07:05

Couin Couiiiinnn :D

Bon je savais pas trop quoi donner comme titre au sujet...

Gestion automatique de disques à la demande sur le site de la radio, chaque auditeur peut faire par exemple 4 demandes pour l'émission qui les diffusera.

Je voudrais faire en sorte que ce soit :
- Mélangé
- Equitable (que ce ne soient pas les demandent d'un même auditeur qui passent les unes à la suite des autres ou de manière rapprochée - En fait, que qu'une de chaque auditeur passe, avant de pouvoir passer la deuxième et ainsi de suite)

Pour ce faire, j'ai pondu cette requête :

Code : Tout sélectionner

SELECT DISTINCT(username) As demandeur, (SELECT COUNT(*) FROM requests WHERE username = demandeur and played = 0) AS Nbunlayed, (SELECT COUNT(*) FROM requests WHERE username = demandeur and played != 0) AS Nbplayed, (SELECT songID FROM requests WHERE username = demandeur and played = 0 ORDER BY RAND() LIMIT 1) AS nextdiskal FROM requests ORDER BY Nbplayed ASC, RAND()
Dans notre exemple, tout le monde n'a pas fait le même nomber de demandes, certains auditeurs n'en ont fait qu'une.
J'obtiens un résutlat tel que :
demandeur Nbunlayed Nbplayed nextdiskal
Franky 0 1 NULL
Véro 1 1 1700
Couin 1 1 3109
Marcel 1 1 1270
Serge 0 1 NULL
Cedric 0 2 NULL
(Désolé je n'arrive pas à faire en sorte que ca présente sous forme de tableau, bien que dans l'éditeur les tabulations soient bien prises en compte :( )

Sachant que l'idée c'est d'obtenir l'ID de la prochaine musique à jouer, il ne faut pas que les lignes où "nextdiskal" est NULL apparaissent.

Alors oui je peux faire un if nextdiskal != null et puis je break dès le premier ID valide rencontré mais comme je voudrais savoir comment on fait une requête permettant de ne pas afficher ces lignes là, je voudrait utiliser un LIMIT 1 à la fin de la requête.

Il faudrait donc que je puisse rajouter une clause WHERE nextdiskal IS NOT NULL, comme ceci :

Code : Tout sélectionner

SELECT DISTINCT(username) As demandeur, (SELECT COUNT(*) FROM requests WHERE username = demandeur and played = 0) AS Nbunlayed, (SELECT COUNT(*) FROM requests WHERE username = demandeur and played != 0) AS Nbplayed, (SELECT songID FROM requests WHERE username = demandeur and played = 0 ORDER BY RAND() LIMIT 1) AS nextdiskal FROM requests WHERE nextdiskal IS NOT NULL ORDER BY Nbplayed ASC, RAND()
mais évidement, je me fais envoyer poueter avec un #1054 - Unknown column 'nextdiskal' in 'where clause' .

Y a-t-il une solution ?

Merkouin :D
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:

Mammouth du PHP | 867 Messages

02 oct. 2021, 22:05

Ne suffit-il pas de déporter ton critère NOT NULL dans la sous-requête SELECT songID FROM requests ?

SELECT DISTINCT(username) As demandeur,
(SELECT COUNT(*) FROM requests WHERE username = demandeur and played = 0) AS Nbunlayed,
(SELECT COUNT(*) FROM requests WHERE username = demandeur and played != 0) AS Nbplayed,
(SELECT songID FROM requests WHERE username = demandeur and played = 0 AND songID IS NOT NULL ORDER BY RAND() LIMIT 1) AS nextdiskal
FROM requests
WHERE nextdiskal IS NOT NULL
ORDER BY Nbplayed ASC, RAND()

ou encore tu peux reprendre toute cette belle requête en en faire une sous-requête comme ceci:
SELECT * FROM
(SELECT DISTINCT(username) As demandeur,
(SELECT COUNT(*) FROM requests WHERE username = demandeur and played = 0) AS Nbunlayed,
(SELECT COUNT(*) FROM requests WHERE username = demandeur and played != 0) AS Nbplayed,
(SELECT songID FROM requests WHERE username = demandeur and played = 0 AND songID IS NOT NULL ORDER BY RAND() LIMIT 1) AS nextdiskal
FROM requests
)
WHERE nextdiskal IS NOT NULL
ORDER BY Nbplayed ASC, RAND()
Soyez artisans de paix