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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 -*
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 -*
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 -*
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
"Jogo" <jogo@matabio.net> a écrit dans le message de
news:20070719172131.1215f754.jogo@matabio.net...
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.
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.