[SQL] Select, Distinct, Max, Group by et autres fariboles

WRInaute passionné
Bon hé bien je sèche un peu sur une requête... :oops: :oops: :oops:


Donc, je possède une table "historique" permettant d'enregistrer diverses actions relatives à des logins (plus de détails par ici:

historique
id_historique/date_insert/login/table_cible/champ/valeur


Quelques données :

1 20060721112711 client3 client nom Dupuis
2 20060719111630 client3 client newsletter 1
3 20060721112826 client3 client newsletter 0
4 20060913112935 client3 client newsletter 1


Je souhaiterais créer une requete permettant de faire ressortir, pour un login donné, les dernières action effectuées pour le couple table_cible/champ .

Donc ici, pour le login client3, faire ressortir :

1 20060721112711 client3 client nom Dupuis
4 20060913112935 client3 client newsletter 1

J'ai tenté en vain quelques requêtes (avec GROUP BY, MAX etc...), mais je bloque vraiment pour le coup.


Si une âme charitable passant par là voulait bien éclairer ma lanterne... je lui en serait éternellement reconnaissant.

Merci par avance
 
WRInaute accro
Mr Go, je pense qu'il te manque un champ date (DATETIME) dans ton journal d'historique (ça correspond à une date ça : 20060721112711 ?)

La requête sera alors très facile :

SELECT ce que tu veux WHERE table_cible="'.$tatable.'" ORDER BY TaDate LIMIT 0,30 (affiche les 30 dernières actions de ton client)
 
WRInaute occasionnel
blman : le tri sur sa date, meme ecrite sous forme de string marcherait.
lui il veut grouper par table/champ et recuperer la derniere action
 
WRInaute occasionnel
Totalement au hasard, pas de mysql pour tester, j'avoue mon faible c oracle ;)

Code:
select * from table where login='client3' and date in 
(select mdate from (
(select max(date) as mdate, table_cible_champ from table where login='client3' group by table_cible, champ)
)

J'ai mis le "select mdate.." du milieu car je savais plus sil était possible dans le select le plus imbriqué de grouper sur des champs non sélectés. Si oui, alors le select du milieu saute.
 
WRInaute passionné
Malheureusement, il m'apparaît une jolie erreur de syntaxe...

Code:
SELECT * 
from historique 
WHERE login='client3' 
AND date_insert IN 
(select mdate from ((select max(date_insert) as mdate, table_cible, champ from historique where login='client3' group by table_cible, champ) 
) 
MDB2 Error: syntax error
 
WRInaute discret
Salut,

J'ai fait un petit test vite fait, :
Code:
SELECT *
FROM `histo`
WHERE `login` = 'client3'
GROUP BY `champ`
ORDER BY `date_insert` DESC
Chez moi ça me sort le resultat demandé.

C'est ça ?
 
WRInaute passionné
Code:
SELECT * 
			FROM `historique` 
			WHERE `login` = 'client3' 
			GROUP BY `table_cible`,`champ` 
			ORDER BY `date_insert` DESC

retourne

Code:
Array ( 
[0] => Array ( [id_historique] => 1 [date_insert] => 20060721112711 [login] => client3 [table_cible] => client [champ] => nom [valeur] => Dupuis ) 

[1] => Array ( [id_historique] => 2 [date_insert] => 20060719111630 [login] => client3 [table_cible] => client [champ] => newsletter [valeur] => 1 ) )


date_insert devrait être égal à 20060921112935 pour la deuxième ligne. :(
 
WRInaute occasionnel
Nouvelle tentative, va falloir que tu renommes les champs :

Code:
select * from matable where login='client3' and date in (
select mdate from (select max(date) as mdate, cible, champ from matable where login='client3' group by cible, champ) as mdate
)
 
WRInaute passionné
select * from historique where login='client3' and date_insert in (
select mdate
from (select max(date) as mdate, table_cible, champ from historique where login='client3' group by table_cible, champ) as mdate
)

MDB2 Error: syntax error

Malheureusement, non plus... ;/
 
WRInaute passionné
Je rebondis sur moi même ^^ :

pour donner une idée, la requête devrait être la suivante

Code:
select DISTINCT (table_cible,champ), [AUTRES CHAMPS] 
from historique 
where login='client3' 
ORDER BY date_insert DESC

Bien évidemment, cette requête ne marche absolument pas... =)
 
Discussions similaires
Haut