[MySQL] enregistrements les plus récents, par contact

pacooo

Membre enregistré
3 Mai 2006
6
0
Bonjour à tous,

Je reviens chercher de l'expertise au sujet d'une requête MySQL. En effet, je cherche à afficher, pour chaque Contact présent dans ma base, l'Action la plus récente qui lui est associée. Et je ne vois pas trop comment faire... Il semblerait qu'il faille utiliser l'opérateur LEFT JOIN mais je n'ai pas tout compris.

La requête actuelle, qui me donne l'ensemble des actions pour chaque contact est la suivante :

SELECT ENTREPRISE.NomEntreprise, CONTACT.NomContact, CONTACT.TelContact, CONTACT.EmailContact, CONTACT.DescriptionContact, CONTACT.CodeContact as LECODECONTACT,
CATEGORIE_CONTACT.IntituleCategorie,
ORIGINE_ACTION.Origine, ACTION.DescriptionAction, ACTION.DateAction
FROM ORIGINE_ACTION, ACTION, ENTREPRISE, CONTACT, CATEGORIE_CONTACT
WHERE ACTION.CodeOrigine = ORIGINE_ACTION.CodeOrigine
AND ACTION.CodeContact = CONTACT.CodeContact
AND CONTACT.CodeEntreprise = ENTREPRISE.CodeEntreprise
AND CONTACT.CodeCategorie = CATEGORIE_CONTACT.CodeCategorie
order by ACTION.DateAction DESC
LIMIT 0, 30

Merci d'avance !

Have a nice day,

françois.
 
Bloc de code:
SELECT TmpA.id,TmpA.pcode, IFNULL(testA.pvalue,'') as pvalue 
FROM 
( 
SELECT testA.id, testB.pcode,testA.pvalue,testB.pstate 
FROM testA CROSS JOIN testB 
ORDER BY testA.id 
) as TmpA 
LEFT OUTER JOIN testA ON TmpA.pcode=testA.pcode AND TmpA.id=testA.id 
WHERE TmpA.pstate=1 
GROUP BY TmpA.id, TmpA.pcode, testA.pvalue 
ORDER BY TmpA.id 

-- 
-- Table structure for table `testA` 
-- 
CREATE TABLE `testA` ( 
`id` varchar(6) collate utf8_unicode_ci NOT NULL default '', 
`pcode` varchar(6) collate utf8_unicode_ci NOT NULL default '', 
`pvalue` varchar(6) collate utf8_unicode_ci NOT NULL default '' 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
-- 
-- Dumping data for table `testA` 
-- 
INSERT INTO `testA` VALUES ('u50001', 'P00001', 'nom'); 
INSERT INTO `testA` VALUES ('u50001', 'P00002', 'prénom'); 
INSERT INTO `testA` VALUES ('u50001', 'P00003', 'rue'); 
INSERT INTO `testA` VALUES ('u50001', 'P00004', 'ville'); 
INSERT INTO `testA` VALUES ('u50002', 'P00001', 'nom'); 
INSERT INTO `testA` VALUES ('u50002', 'P00002', 'prénom'); 
INSERT INTO `testA` VALUES ('u50002', 'P00003', 'rue'); 
INSERT INTO `testA` VALUES ('u50002', 'P00004', 'ville'); 
INSERT INTO `testA` VALUES ('u50003', 'P00001', 'nom'); 
INSERT INTO `testA` VALUES ('u50003', 'P00003', 'rue'); 
INSERT INTO `testA` VALUES ('u50003', 'P00004', 'ville'); 

-- 
-- Table structure for table `testB` 
-- 
CREATE TABLE `testB` ( 
`pcode` varchar(6) collate utf8_unicode_ci NOT NULL default '', 
`pstate` int(11) NOT NULL default '0' 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
-- 
-- Dumping data for table `testB` 
-- 
INSERT INTO `testB` VALUES ('P00002', 1); 
INSERT INTO `testB` VALUES ('P00003', 1); 
INSERT INTO `testB` VALUES ('P00004', 0); 
INSERT INTO `testB` VALUES ('P00001', 0); 
INSERT INTO `testB` VALUES ('P00005', 1);
 
pacooo a dit:
Bonjour à tous,

Je reviens chercher de l'expertise au sujet d'une requête MySQL. En effet, je cherche à afficher, pour chaque Contact présent dans ma base, l'Action la plus récente qui lui est associée. Et je ne vois pas trop comment faire... Il semblerait qu'il faille utiliser l'opérateur LEFT JOIN mais je n'ai pas tout compris.
Question bête : le fait qu'un contact existe implique-t-il qu'une action existe ou non ?
En bref : existe-t-il des contacts sans action et quel resultat attends-tu en retour le cas échéant ?
 
starmac a dit:
Question bête : le fait qu'un contact existe implique-t-il qu'une action existe ou non ?
En bref : existe-t-il des contacts sans action et quel resultat attends-tu en retour le cas échéant ?

Hello Starmac,

Merci de venir à mon secours encore une fois ;-)

Dans mon système, le fait qu'un contact existe n'implique pas forcément l'existence d'une action qui lui est associée.
S'il existe des contacts sans action, ils ne doivent pas apparaitre en résultat de cette requête.

Thanks!

françois.
 
Donc il te suffit de tranformer ta requête globale (pour peu que ce soit les champs que tu veux voir apparaître) très légèrement :

Au lieu d'écrire ACTION.DateAction écris max(ACTION.DateAction)
et ajoute la clause Group By Contact.CodeContact

C'est à dire :
Bloc de code:
SELECT ENTREPRISE.NomEntreprise, CONTACT.NomContact, CONTACT.TelContact, CONTACT.EmailContact, CONTACT.DescriptionContact, CONTACT.CodeContact as LECODECONTACT,
CATEGORIE_CONTACT.IntituleCategorie,
ORIGINE_ACTION.Origine, ACTION.DescriptionAction, [COLOR="Red"][B]max(ACTION.DateAction)[/B][/COLOR]
FROM ORIGINE_ACTION, ACTION, ENTREPRISE, CONTACT, CATEGORIE_CONTACT
WHERE ACTION.CodeOrigine = ORIGINE_ACTION.CodeOrigine
AND ACTION.CodeContact = CONTACT.CodeContact
AND CONTACT.CodeEntreprise = ENTREPRISE.CodeEntreprise
AND CONTACT.CodeCategorie = CATEGORIE_CONTACT.CodeCategorie
[B][COLOR="red"]Group by LECODECONTACT[/COLOR][/B]
LIMIT 0, 30

Explications : Comme la date est en fait une valeur numérique, on peut en chercher la valeur maximale. Group by LECODECONTACT permet de réaliser l'extraction codecontact par codecontact.
 
certes mais en sql il y a les requetes qui prennent de 2 sec sur 100 data
et celles qui traitent plus de 50000 entrées en 1/100 sec

#FROM ORIGINE_ACTION, ACTION, ENTREPRISE, CONTACT, CATEGORIE_CONTACT

:D:D:D

a plat qui fait le gas allez hop :D:D:D:D:D:D:D:D:D:D a la va comme je te pousse
:D:D:D:D:D
 
Oui, Tatouille, oui.

Et il y a celles qu'on comprend et celles qu'on ne comprends pas, avec une telle force qu'on ne sait même pas si elles répondant à la question.

Penses-tu vraiment que pacoo a compris un traitre mot de ton code quand il ne connait pas l'instruction max ? Penses-tu qu'il est en mesure de l'adapter à ses besoins ?

Moi non et je me demande encore ce que tu as voulu montrer...

Enfin, bref... bon week-end.
 
le sql est assé directif pour que l'on comprenne ce que l'on écrit
il fautd'abord faire des tris pour reconstruire la il ya une requetes qui explore des cases
dont on a que faire 5 tables en tmp en même temps totalement puis pourchaque table les tmp
de comparaison brute line by line

je lui ai donné un exemple de pivot et c'est son cas faire un pivot
 
Il n'a pas besoin d'un pivot : regarde sa réponse #6.

Il n'a besoin que d'une simple requête avec max et group by.

A-t-il besoin de tous les champs cités et donc d'activer toutes ces tables… à lui de voir. C'est une autre question.

Enfin bref : ton système est sympa mais ne répond pas à sa demande ;)

PS : SQL est assez directif, dis-tu pour que l'on comprenne ce que l'on écrit... Pas toujours ce que l'on lit… nuance.
 
Bonjour tout le monde,

J'espère que vous avez bien profité de votre week-end ;)

Starmac, j'ai essayé de modifier ma requête selon tes recommandations, et je n'ai plus de résultat du tout...

Bon, de toute façon le commanditaire pour cette requete veut désormais, et c'est son dernier mot, que les contacts pour lesquels il n'y a pas d'action soient quand même listés.

Je suppose qu'il va donc falloir que je découvre la monde fabuleux des pivots... Quelqu'un pourrait-il m'expliquer clairement de quoi il en retourne ?

Thanks all

françois.
 
Pacoo : peux-tu dire quels sont les renseignements que tu souhaites voir apparaitre dans tes résultats : les champs.
Peux_tu aussi nous donner pour chaque table de la base sa clé primaire ou nous faire un petit dessin de la structure.

En aveugle, ce n'est pas terrible pour faire des propositions.
 
Hello,

Voilà ci-joint un tableau récapitulatif de toutes les infos que j'ai envie de faire sortir de ma requête.

Merci encore pour votre aide!

françois.