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


mr_go
WRInaute passionné
WRInaute passionné
 
Messages: 1945
Inscription: 21 Sep 2005

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

Message le Ven Juil 21, 2006 10:53

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


blman
WRInaute accro
WRInaute accro
 
Messages: 3077
Inscription: 5 Sep 2003

Message le Ven Juil 21, 2006 11:05

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)
Dernière édition par blman le Ven Juil 21, 2006 11:27, édité 2 fois.


ltressens
WRInaute impliqué
WRInaute impliqué
 
Messages: 551
Inscription: 2 Avr 2004

Message le Ven Juil 21, 2006 11:16

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


ltressens
WRInaute impliqué
WRInaute impliqué
 
Messages: 551
Inscription: 2 Avr 2004

Message le Ven Juil 21, 2006 11:22

Totalement au hasard, pas de mysql pour tester, j'avoue mon faible c oracle ;)

Code: Tout sélectionner
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.


mr_go
WRInaute passionné
WRInaute passionné
 
Messages: 1945
Inscription: 21 Sep 2005

Message le Ven Juil 21, 2006 13:10

Malheureusement, il m'apparaît une jolie erreur de syntaxe...

Code: Tout sélectionner
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


siddhy
WRInaute discret
WRInaute discret
 
Messages: 163
Inscription: 20 Sep 2004

Message le Ven Juil 21, 2006 13:37

Salut,

J'ai fait un petit test vite fait, :
Code: Tout sélectionner
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 ?


mr_go
WRInaute passionné
WRInaute passionné
 
Messages: 1945
Inscription: 21 Sep 2005

Message le Ven Juil 21, 2006 13:45

Code: Tout sélectionner
SELECT *
         FROM `historique`
         WHERE `login` = 'client3'
         GROUP BY `table_cible`,`champ`
         ORDER BY `date_insert` DESC


retourne

Code: Tout sélectionner
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. :(


ltressens
WRInaute impliqué
WRInaute impliqué
 
Messages: 551
Inscription: 2 Avr 2004

Message le Ven Juil 21, 2006 13:49

Nouvelle tentative, va falloir que tu renommes les champs :

Code: Tout sélectionner
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
)


mr_go
WRInaute passionné
WRInaute passionné
 
Messages: 1945
Inscription: 21 Sep 2005

Message le Ven Juil 21, 2006 14:03

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... ;/


mr_go
WRInaute passionné
WRInaute passionné
 
Messages: 1945
Inscription: 21 Sep 2005

Message le Ven Juil 21, 2006 14:16

Je rebondis sur moi même ^^ :

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

Code: Tout sélectionner
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... =)


ltressens
WRInaute impliqué
WRInaute impliqué
 
Messages: 551
Inscription: 2 Avr 2004

Message le Ven Juil 21, 2006 14:38

La derniere que je t'ai donné fonctionne sur un mysql que j'ai dégoté. Tables InnoDB. Mysql 5.0.18


mr_go
WRInaute passionné
WRInaute passionné
 
Messages: 1945
Inscription: 21 Sep 2005

Message le Ven Juil 21, 2006 14:41

Mysql 5.0.18


En local, je n'en suis qu'à la version 4.x.

Néanmoins, j'ai tenté d'émuler cette requete via MDB2, mais j'obtiens une erreur de syntaxe... :(


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités