Problème select distinct

Nouveau WRInaute
Bonjour,

J'ai une table qui ressemble à ça :
date------------------ lib ----user---- code
28/04/2010---------- A ------1---------2
28/04/2010 ----------A ------1---------3
28/04/2010 ----------A ------1---------4
28/04/2010 ----------A ------2---------5
28/04/2010 ----------A ------2---------6
27/04/2010 ----------A ------1---------7
27/04/2010 ----------A ------1---------8
27/04/2010 ----------A ------1---------9

et j'aimerais ça :

date------------------ lib ----user---- code
28/04/2010 ----------A ------ 1---------2
28/04/2010 ----------A ------ 2---------5
27/04/2010 ----------A ------ 1---------7
27/04/2010 ----------A ------ 1---------9

En faite je veux faire une requête qui supprime les doublons d'une date correspondant au même user : c'est à dire que je veux voir que l'user 1 a fait l'action (lib) le 28/04/2010 mais je ne veux voir qu'une seule action la première de la journée par exemple. car après je vais faire une autre fichier s'appelant détail.php qui renverra vers les autres actions que cet utilisateur à fait.

ma requête c'est :

Code :

SELECT DISTINCT CODE, LIB,USER, LADATE
FROM `MATABLE`
GROUP BY LADATE, USER
ORDER BY USER,LADATE DESC
LIMIT 200


quand je fait ça mon fichier php charge pendant des heures et finit par me renvoyé une erreur qui me dit que je vien de planter mon serveur comment dois-je faire
 
WRInaute impliqué
Intéressant :)

Code:
SELECT mat.*
FROM `MATABLE` AS mat
INNER JOIN (SELECT MIN(DATE) AS DATE FROM `MATABLE` GROUP BY USER) AS temp
ON mat.USER = temp.USER
ORDER BY mat.USER, mat.DATE DESC 
LIMIT 200

Ca me semble pas mal :)
L'idée est de générer une table temporaire avec des résultats uniques de la date par utilisateur, elle s'appelle ici temp.
Ca ne fonctionnera que si tu as ta date au format numérique je pense, pas comme tu l'as affiché dans l'exemple.

Sinon pour l'erreur, quelle est la taille de ta table, si grande que ça?
 
WRInaute accro
Déjà, un DISTINCT et un GROUP BY dans la même requête, ce n'est généralement pas nécessaire (sauf cas très particulier c'est même plutôt mauvais signe). Ensuite, si tu fais un GROUP BY, tu ne dois avoir comme colonnes dans ton SELECT que celles du GROUP BY ou des agrégats (count, sum, avg, min, max...). Et si tu utilises DISTINCT, ça veut dire qu'il doit ignorer les lignes qui sont exactement identiques.

Donc, soit:

SELECT DISTINCT date,user FROM table ORDER BY date,user

Soit:

SELECT date,user,min(lib),min(code) FROM table GROUP BY date,user ORDER BY date,user

NB: dans le deuxième cas, le lib et le code ne viennent pas forcément de la même ligne. Si c'est nécessaire, tu peux effectivement utiliser la même de la jointure de la table avec un sub-select sur elle-même comme évoqué par Dr DLP, mais il manque des bouts dans la requête suggérée.

Evidemment, sans connaître la taille de ta table, les index, etc, difficile de dire si une telle requête a une vague chance de s'exécuter en un temps raisonable.

Jacques.
 
Discussions similaires
Haut