req sql Max(id) + GROUP/[RESOLU]

req sql Max(id) + GROUP/[RESOLU] - SQL/NoSQL - Programmation

Marsh Posté le 28-09-2007 à 14:04:28    

hello  
voila une requet qui ne fonctione pas !! :s  
alors le probleme vien surement de :
b.id in (SELECT MAX(id) FROM suivi_aeronef GROUP BY nmr, nbrnmr, lettre ORDER BY id');
je ne comprend pas pourqoi mais cela bloque le tableau array,  erreur sql variable incorect..
voila si quelqu un a une soluce je le remercie d avance  
 
le but :
j ai une table avec les champ NMR NBRNMR LETTRE qui sont identique dans certain enregistrement  
je ne veux que les enregistrement avec le PLUS GRAND ID(MAX(id))  
 

Code :
  1. <?php
  2. $retour = mysql_query('SELECT * FROM aeronef AS a, suivi_aeronef AS b WHERE a.id = b.id_cle and a.valide != "2" and b.id in (SELECT MAX(id) FROM suivi_aeronef GROUP BY nmr, nbrnmr, lettre ORDER BY id DESC');
  3. while ($donnees = mysql_fetch_array($retour))  // On fait une boucle pour lister
  4. {
  5. ?>


 
$= il y a deux autre condition qui elle fonctione tres bien ( valide != 2 et la liason id = id )
 
voila merci d avance pour votre aide


Message édité par ails le 19-10-2007 à 09:43:23

---------------
Ritouné mwen lé ritounin
Reply

Marsh Posté le 28-09-2007 à 14:04:28   

Reply

Marsh Posté le 28-09-2007 à 14:08:49    

l'oubli de parenthèse avant de fermer ta chaîne est une erreur de copier-coller ? ;)

Code :
  1. //origine
  2. $retour = mysql_query('SELECT * FROM aeronef AS a, suivi_aeronef AS b WHERE a.id = b.id_cle and a.valide != "2" and b.id in (SELECT MAX(id) FROM suivi_aeronef GROUP BY nmr, nbrnmr, lettre ORDER BY id DESC');


Code :
  1. //je propose
  2. $retour = mysql_query('SELECT * FROM aeronef AS a, suivi_aeronef AS b WHERE a.id = b.id_cle and a.valide != "2" and b.id in (SELECT MAX(id) FROM suivi_aeronef GROUP BY nmr, nbrnmr, lettre ORDER BY id DESC)');
  3. //ou
  4. $retour = mysql_query('SELECT * FROM aeronef AS a, suivi_aeronef AS b WHERE a.id = b.id_cle and a.valide != "2" and b.id in (SELECT MAX(id) FROM suivi_aeronef) GROUP BY nmr, nbrnmr, lettre ORDER BY id DESC');


Message édité par yyyeeeaaahhh le 28-09-2007 à 14:11:20
Reply

Marsh Posté le 28-09-2007 à 14:09:19    

où est l'intéret de mettre un order by vu que tu fais un in avant ?
il me semble aussi que ca serait mieux si tu mets ton Max(id) as id aussi :)

Reply

Marsh Posté le 28-09-2007 à 14:25:43    

j'ai modifié Max(id) as id et la ) mais toujours la même erreur
 
Merci d'avance


Message édité par ails le 28-09-2007 à 14:26:09
Reply

Marsh Posté le 28-09-2007 à 15:01:17    

voila le msg d erreur : You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT MAX(id) as idmax FROM suivi_aeronef GROUP BY nmr, nbrnmr

Reply

Marsh Posté le 28-09-2007 à 16:14:31    

bon un ami du nom de Bab qui ma beaucoup aidé a trouvé cela :
 
SELECT MAX(b.id), b.nmr,b.nbrnmr, b.lettre
FROM aeronef AS a, suivi_aeronef AS b  
WHERE a.nmr = b.nmr  
AND a.nbrnmr = b.nbrnmr  
AND a.lettre = b.lettre  
AND a.valide != "2"
GROUP BY b.nmr, b.nbrnmr, b.lettre
 
cela fonctione mais pas completement :
j ai bien 1 enregistrement par group  
 
mais j ai pas l enregistrement avec le plus grand id il ne me prend pas en compt la fonction MAX(b.id) :/
 
voila si vous avez une idée qui peut m aidé je vous ecoute merci

Reply

Marsh Posté le 01-10-2007 à 10:31:46    

hello je fait un edit puisque le poste ne sert a rien

Code :
  1. <?php
  2. $retour = mysql_query('SELECT MAX(id) as bid, nbrvoleff FROM suivi_aeronef GROUP BY nmr, nbrnmr, lettre');
  3. if (! $retour) echo mysql_error();
  4. while ($donnees = mysql_fetch_array($retour))  // On fait une boucle pour l
  5. ister les news
  6. {
  7. ?>


 
voila j ai cette requette elle fonctione.
mais le champ "nbrvoleff" doit affiché des donné et celle si ne sont pas les bonne il me sort les donné d un autre id que l id max.
 
exmple :
 
id | nbrvoleff | nmr | numeronmr | lettrenmr
1 |       20    | truc |    001       | A
2 |       30    | truc |    001       | A dans ce group le max id sort bien 3 mai me donne 20 pour nbrvoleff alors  
3 |       40    | truc |    001       | A que c'est 40 sur la igne 3
4 |       88    | blop |    002       | B
5 |       99    | blop |    002       | B
 
 
help plz merci d'avance.


Message édité par ails le 02-10-2007 à 09:12:33

---------------
Ritouné mwen lé ritounin
Reply

Marsh Posté le 02-10-2007 à 09:13:41    

UP! Désolé ca urge : / :'(

Reply

Marsh Posté le 02-10-2007 à 11:27:53    

Déjà, deux trucs :
1/ Poste tes requêtes sans le code PHP autour, car c'est pas clair à lire
2/ C'est d'autant plus important que si le bug vient de ton script PHP c'est plus facile à détecter quand on débug le SQL seul
 
Sinon, c'est normal, tu dois passer par une sous-requête pour déterminer le max. Les fonctions d'agrégation ne permettent pas de faire un regroupement sur un champ et en même temps retourner des infos correspondant à la valeur retournée par la fonction d'agrégat

Reply

Marsh Posté le 02-10-2007 à 12:03:35    

Merci MagicBuzz
 
visiblement cela ne marche pas :S
je n'est jamais vue de sous requet je cherche sur internet en attente de quelques conseils merci par avance.
 
petit test mais ce n'est pas bon .. c'est pas comme ca ?
edit modif du code

Code :
  1. <?php
  2. $retour = mysql_query('SELECT nbrvoleff FROM suivi_aeronef GROUP BY nmr, nbrnmr, lettre WHERE id = (SELECT MAX(id) FROM suivi_aeronef)');
  3. if (! $retour) echo mysql_error();
  4. while ($donnees = mysql_fetch_array($retour))
  5. {
  6. ?>


pas encore le bon code mais je croi que c'est un peut mieu nan ?
>_< bon dieu que je suis nul snif


Message édité par ails le 02-10-2007 à 12:30:45

---------------
Ritouné mwen lé ritounin
Reply

Marsh Posté le 02-10-2007 à 12:03:35   

Reply

Marsh Posté le 02-10-2007 à 12:08:14    

grmpf :sweat:

Reply

Marsh Posté le 02-10-2007 à 12:08:47    

bon, on reprend, tu veux quoi au juste ?
 
en tout cas, ta requête fait du grand total n'importe quoi :o

Reply

Marsh Posté le 02-10-2007 à 12:15:45    

erf oui ..  
 
alors j ai une table comme celle ci :  
 
id | nbrvoleff | nmr | numeronmr | lettrenmr
1 |       20    | truc |    001       | A  
2 |       30    | truc |    001       | A  
3 |       40    | truc |    001       | A
4 |       88    | blop |    002       | B  
5 |       99    | blop |    002       | B  
 
je cherche a afficher dans un tableau array parmi le group nmr numeronmr et lettrenmr l'enregistrement qui à le plus grand ID (MAX(id)) et le champ nbrvoleff qui correspond a ce MAX(id)
 
j'espere que je suis clair ?  
merci.

Reply

Marsh Posté le 02-10-2007 à 12:26:42    

On décompose :
 
Recherche du max(id) pour le groupe nmr, numeronmr, lettrenmr :
 

Code :
  1. SELECT max(id)
  2. FROM suivi_aeronef
  3. GROUP BY nmr, numeronmr, lettrenmr


 
Recherche des infos pour un id donné :
 

Code :
  1. SELECT nrbvoleff, nmr, numeronmr, lettrenmr
  2. FROM suivi_aeronef
  3. WHERE id = valeur


 
Mix des deux :
 

Code :
  1. SELECT b.nrbvoleff, b.nmr, b.numeronmr, b.lettrenmr
  2. FROM (
  3.   SELECT max(id) id
  4.   FROM suivi_aeronef
  5.   GROUP BY nmr, numeronmr, lettrenmr
  6. ) a
  7. INNER JOIN suivi_aeronef b ON b.id = a.id

Reply

Marsh Posté le 02-10-2007 à 12:34:42    

edit WAaaaaaaaaaaaaa ^^
 
bon j ai testé ton code je vien juste de comprendre ^^"  
mais il ne fontione pas :'(  
bon j ai modifier comme cela :  
 

Code :
  1. SELECT b.nrbvoleff, b.nmr, b.numeronmr, b.lettrenmr
  2. FROM (SELECT max(id) idmax FROM suivi_aeronef GROUP BY nmr, numeronmr, lettrenmr) a
  3. INNER JOIN suivi_aeronef b
  4. ON b.id = a.idmax


 
 et pas mieux :d


Message édité par ails le 02-10-2007 à 12:42:41

---------------
Ritouné mwen lé ritounin
Reply

Marsh Posté le 02-10-2007 à 12:40:15    

nan, c'est juste une jointure entre ta table et la sous-requête qui donne la liste des plus grands id...

Reply

Marsh Posté le 02-10-2007 à 12:47:57    

erf je trouve pas pourquoi la requete ne fontione pas je comprend mieu les jointures de "requetes" "sous requetes" grace a toi en tout cas ^^  
merci beaucoup!
 
 
EDIT j'utilise MYSQL 4.0.18


Message édité par ails le 02-10-2007 à 12:56:59

---------------
Ritouné mwen lé ritounin
Reply

Marsh Posté le 02-10-2007 à 13:53:17    

Sous-requêtes supportées à partir de MySQL 4.1 :p
 
Change de version de MySQL, ou demande à un bidouilleur MySQL, moi je sais pas faire autrement ;)

Reply

Marsh Posté le 02-10-2007 à 13:57:04    

merci beaucoup je repasse pour te donné mes resultats merci encore ;)


Message édité par ails le 02-10-2007 à 13:57:28
Reply

Marsh Posté le 02-10-2007 à 14:01:32    

Ah si, tiens, j'ai trouvé une syntaxe qui marche...
 

Code :
  1. SELECT ret2.sigtie, max(ret1.numeve), ret2.numeve, ret2.dateve
  2. FROM eve ret1
  3. INNER JOIN eve ret2 ON ret2.codsoc = ret1.codsoc AND ret2.achvte = ret1.achvte AND ret2.typeve = ret1.typeve AND ret2.sigtie = ret1.sigtie AND ret2.dateve > '20070901'
  4. WHERE ret1.codsoc = 2
  5. AND ret1.achvte = 'V'
  6. AND ret1.typeve = 'RET'
  7. AND ret1.dateve > '20070901'
  8. GROUP BY ret2.sigtie, ret2.numeve, ret2.dateve
  9. HAVING ret2.numeve = max(ret1.numeve)
  10. ORDER BY sigtie, numeve


 
Je te laisse te démerder pour adapter à ton problème :p
 
Ici, je récupère :
Pour les retours marchandise de vente (achvte = V et typeve = RET) dans la société 2 (codsoc = 2) depuis le premier septembre (dateve > 20070901)
=> Le dernier avoir : max(ret1.numeve)
=> Les informations de cet avoir : les champs de ret2
 
Le "group by" sert à récupérer la liste de tous les derniers numéros d'avoir pour les clients (regroupement sur le champ ret2.sigtie qui est utilisé dans la jointure avec le ret1, donc regroupement implicite sur ret1.sigtie)
Le having permet de filtrer seulement les lignes de ret2 (liste des retours pour chaque client utilisé pour le regroupement des max(ret1.numeve)) qui correspondent justement à ce max
 
C'est clairement pas clair comme syntaxe, mais ça marche :D


Message édité par MagicBuzz le 02-10-2007 à 14:06:56
Reply

Marsh Posté le 02-10-2007 à 14:45:20    

Merci Amigo !
 
c'est bien Mysql 4.0.18 qui n aime pas INNER JOIN donc a la prochaine question ^^"
 
merci encore !
 
edit je n'avais pas vu la derniere syntaxe je test et je te laisse mais question je vais regarder cela de plus pres @+tard


Message édité par ails le 02-10-2007 à 14:48:46
Reply

Marsh Posté le 02-10-2007 à 14:56:26    

non, rien à voir avec inner join
 
mysql 2 aime inner join.
 
ce qu'il n'aime pas c'est les sous-requêtes

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed