Version complète: sur le forum Webmaster Hub : requete
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
genmin
Bonjour, voilà je voudrai réaliser une requete sur 3 tables. je m'explique :

J'ai une table membre avec les champs ID_membre, nom etc...
une 2ème table infos avec les champs ID_membre, type, etc...
et une troisième, commentaire avec les champs ID_membre, commentaire, date.

Voilà, pour info dans les 2 première tables il n'y a qu'un seul enregistrement par membre, par contre un membre peu avoir plusieur commentaire qui sont daté.

Que dois je mettre dans ma requete pour sortir un tableau avec les infos de tous mes membres et uniquement leur dernier commentaire. dry.gif
PhantomJoey
Salut genmin,

Voici pour ta requète:
CODE
SELECT commentaire, MAX(date)
FROM TABLE1 A, TABLE2 B, TABLE3 C
WHERE A.ID_membre=B.ID_membre
AND B.ID_membre=C.ID_membre
AND date=MAX(date);


Si ça ne marche pas dis le moi. wink.gif
genmin
Merci Phantom Joey pour tout aide, j'essai et je te dis si ca marche
genmin
oups il semblerai qu'il y ai un petit problème. wacko.gif

Invalid use of group function, qu'il me donne !!!

je te donne ma requete complète, peut etre que j'ai fais une erreur. tongue.gif

CODE
$query_Recordset1 = "SELECT * FROM oempv3_subscribers, oempv3_extrafields, historique_com WHERE oempv3_subscribers.subscriber_id = oempv3_extrafields.subscriber_id AND oempv3_subscribers.subscriber_id = historique_com.subscriber_id AND historique_com.date = MAX(historique_com.date) AND oempv3_extrafields.Acquereur != '' AND oempv3_subscribers.statut = 'En cours' AND oempv3_subscribers.idnego= '$negoliste' AND oempv3_subscribers.agence='$agence' ORDER BY $trie";


Merci pour ton aide wink.gif
Anonymus
Bonjour,

le MAX que tu places dans la partie WHERE de ta requète donne une erreur, c'est normal. On peut le placer uniquement dans la partie SELECT.
Pour la date, on ne sait pas sous quelle format tu l'enregistres, et ca peut donc etre source d'erreur.

Pour les tables, quand elles sont aussi longues (à écrire), tu devrais utiliser un alias.=> table1 AS t1

Ensuite, on n'a pas la valeur de $trie. C'est d'ailleurs là que se fera l'ordre que tu veux mettre avec MAX.

Enfin, tu n'utilises pas LIMIT, qui te permettrait de n'avoir 'que' le dernier commentaire.

Voilà, a+, Anonymus.
genmin
Bonjour anonymus,

Alors pour ce qui est du Max dans la partie where je venais juste de m'en rendre compte, ensuite pour les alias tu as surement raison mais je ne les mettrise pas totalement encore.

Pour ce qui est de $trie il s'agit juste du nom d'une des colones pour faire un trie, par nom, budget, etc...

Et pour finir je ne crois pas que LIMIT soit la commande à utiliser car je désire faire la liste de tout les enregistrements des membres mais avec uniquement leurs derniers commentaires.

J'espère que je suis suffisement claire (pas facile à expliquer), si vous avez la moindre question je suis dispo.

Merci
Anonymus
Penses aussi à ne pas surcharger les lignes. Une commande par ligne, c'est suffisant, tu y gagnera en clarté, et sql comprend les sauts de ligne.
La requete donnerait ceci :

CITATION
SELECT *

FROM oempv3_subscribers AS os, oempv3_extrafields AS oe, historique_com AS hc

WHERE os.subscriber_id = oe.subscriber_id
AND os.subscriber_id = hc.subscriber_id

AND oe.Acquereur != ''

AND os.statut = 'En cours'

AND os.idnego= '$negoliste'

AND os.agence='$agence'

ORDER BY $trie


Mais j'ai enlevé le MAX, ainsi que la date. Il te faut une clause LIMIT, ainsi que nous dire quel est le format du champ date.

Anonymus.

ps : au fait, date est un mot clé du sql. Tu aurais dû en choisir un autre sad.gif
PhantomJoey
Pour les allias c'est simple :

Par exemple:
CODE
oempv3_subscribers as S


Puis lorsque tu l'utilise, dans le where par exemple:
CODE
S.subscriber_id=.......


Pour le LIMIT je ne sais pas comment l'utiliser car je sais que si par exemple:
CODE
LIMIT 0,30


Cela va te donner les enregistrement de la ligne 0 à 30 de ton résultat.
C'est tout ce que je peux te dire.
Désolé de ne pas pouvoir plus t'aider. sad.gif
Anonymus
Utilisation du limit :

La première valeur donne la ligne de départ,
la deuxieme valeur donne le nombre de lignes.
Donc effectivement, dans LIMIT 0,30,
sql te retourne les lignes :
- à partir de la ligne 0
- pendant 30 lignes.
Tu auras donc 30 lignes.

Anonymus.
genmin
Merci tous c'est bon conseil, j'ai compris pour les alias.

Pour la date je suis sous la forme 0000-00-00.

Pour ce qui est du LIMIT il ne vas pas faire ce que j'attends.
Il vas me limiter à un certain nombre d'enregistrement alors que je les veux tous de la table subscribers mais seulemnt le plus récent de la table commentaire.


wacko.gif
genmin
ya plus personnes ????? sad.gif wacko.gif
Anonymus
Bonjour,

Si, mais on te laisse mijoter biggrin.gif

Normalement, sql permet de faire des requetes imbriquées. Mais ca ne marche pas toujours avec mysql.

La solution consiste donc à trouver dans un premier temps le max(date).

Pour cela, une simple requete suffit :

CODE
$max_date == SELECT max(date) FROM historique_com



Ensuite, tu fais la recherche avec la nouvelle valeur, en donnant dans le WHERE la valeur retournée par la première requète.

CODE
SELECT *
FROM tables
WHERE date = $max_date
AND ....


voilà wink.gif
genmin
Je vais essaier, merci pour le coup de main
genmin
j'arrvi po sick.gif .
Je crois que je vais laisser tomber car plus ca vas et plus je pense que c'est pas possible......
A moin de passer par une table tempo, j'ai apercu ca, je sais pas si peu fonctionner, je me documente.

A+
Genmin
Anonymus
Intéresses toi aux balises HAVING et GROUP BY, elles permettent probablement de faire ce que tu cherches.

Nico.
genmin
Je ne comprend pas tout là. J'ai une requete qui me trouve bien la dernière date de commentaire mais pas moyen de sortir le commentaire associé ??? wacko.gif


CODE
SELECT T1.fname, T1.subscriber_id, T2.subscriber_id, MAX(T2.date), MAX(T2.com_id), T2.commentaire FROM oempv3_subscribers AS T1, historique_com AS T2 WHERE T1.subscriber_id = T2.subscriber_id GROUP BY T1.subscriber_id



voici le resultat :
CITATION
fname      subscriber_id     subscriber_id      MAX(T2.date)     MAX(T2.com_id)     commentaire 
FRITZ          3                   3                   2004-03-06               6               ou la la la tres chiant lui!
BOUCHARD  7                   7                   2004-03-09               7                 po gentil


seulemnt voilà le commentaire ne correspond pas à la date ???

A+Genmin
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.