Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[mysql] problèmatique d'agrégation

2 réponses
Avatar
Stan
bonjour,

j'ai souvent besoin de requêtes du même type sur une table
similaire à celle-ci :
User
DateTimeCnx
Bytes
LogFile

, je souhaite extraire les utilisateurs dont les connexions
les plus récentes ont le nombre de Bytes à zéro :

SELECT User, MAX(DateTimeCnx), LogFile
FROM Connexions
WHERE Bytes = 0
GROUP BY User

Or la requête ci-dessus ne marche pas dans la mesure où je
souhaite avoir le User et le LogFile
correspondant au MAX(DateTimeCnx).
Comment faut-il faire ?

Merci.

--
-Stan

2 réponses

Avatar
Jogo
Sur fr.comp.applications.sgbd, Stan disait :

SELECT User, MAX(DateTimeCnx), LogFile
FROM Connexions
WHERE Bytes = 0
GROUP BY User

Or la requête ci-dessus ne marche pas dans la mesure où je
souhaite avoir le User et le LogFile
correspondant au MAX(DateTimeCnx).
Comment faut-il faire ?



Il me semble que c'est un problème qui n'a as de solutions sans
sous-requêtes en SQL "standart" (sauf peut-être avec SQL2003). Certains
SGBD ont une syntaxe particulière pour ces cas. Par exemple avec
PostgreSQL :

SELECT DISTINCT ON (user) user, dateTimeCnx, logFile
FROM Connexions
WHERE bytes = 0
ORDER BY dateTimeCnx DESC

Si il n'y a rien pour cela dans MySQL (ou si on veut un code portable),
on est forcé de joindre :

SELECT a.user, a.dateTimeCnx, a.logFile
FROM Connexions a JOIN (
SELECT user, MAX(dateTimeCnx) as dtcMax
FROM Connexions WHERE bytes = 0
GROUP BY user ) b
ON a.user = b.user AND a.dateTimeCnx = b.dtcMax

--
Voter [parallélogramme] était permis,
mais seulement le dimanche, si je ne m'abuse.
*- Zelda Touque sur fr.rec.jeux.nomic -*
Avatar
Stan
"Jogo" a écrit dans le message de
news:

Il me semble que c'est un problème qui n'a as de solutions sans
sous-requêtes en SQL "standart" (sauf peut-être avec SQL2003). Certains



Dans un premier temps, j'ai effectivement résollu le pb
avec une sous requête, mais les temps de réponse
étaient trop longs.

J'ai donc contourné ce pb de performance de façon applicative:
je fait une première requête qui concerne les lignes que je doit
afficher ( gestion d'une liste avec LIMIT );
ensuite, j'effectue autant de 'sous requêtes' que j'ai d'items
affichés.

Sur le total d'enregistrements, le fait de faire 1+20 requêtes ( pour 20
lignes à afficher ) est
plus performant que de le faire avec le couple requête + sous-requête.
Sauf erreur de ma part.

--
-Stan