Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1276 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1616591
ails
Mwen ké trouvé un bon chimin
Posté le 28-09-2007 à 14:04:28  profilanswer
 

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
mood
Publicité
Posté le 28-09-2007 à 14:04:28  profilanswer
 

n°1616592
yyyeeeaaah​hh
Posté le 28-09-2007 à 14:08:49  profilanswer
 

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
n°1616594
jpcheck
Pioupiou
Posté le 28-09-2007 à 14:09:19  profilanswer
 

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 :)

n°1616603
ails
Mwen ké trouvé un bon chimin
Posté le 28-09-2007 à 14:25:43  profilanswer
 

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
n°1616627
ails
Mwen ké trouvé un bon chimin
Posté le 28-09-2007 à 15:01:17  profilanswer
 

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

n°1616699
ails
Mwen ké trouvé un bon chimin
Posté le 28-09-2007 à 16:14:31  profilanswer
 

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

n°1617263
ails
Mwen ké trouvé un bon chimin
Posté le 01-10-2007 à 10:31:46  profilanswer
 

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
n°1617704
ails
Mwen ké trouvé un bon chimin
Posté le 02-10-2007 à 09:13:41  profilanswer
 

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

n°1617759
MagicBuzz
Posté le 02-10-2007 à 11:27:53  profilanswer
 

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

n°1617780
ails
Mwen ké trouvé un bon chimin
Posté le 02-10-2007 à 12:03:35  profilanswer
 

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
mood
Publicité
Posté le 02-10-2007 à 12:03:35  profilanswer
 

n°1617783
MagicBuzz
Posté le 02-10-2007 à 12:08:14  profilanswer
 

grmpf :sweat:

n°1617784
MagicBuzz
Posté le 02-10-2007 à 12:08:47  profilanswer
 

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

n°1617787
ails
Mwen ké trouvé un bon chimin
Posté le 02-10-2007 à 12:15:45  profilanswer
 

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.

n°1617796
MagicBuzz
Posté le 02-10-2007 à 12:26:42  profilanswer
 

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

n°1617799
ails
Mwen ké trouvé un bon chimin
Posté le 02-10-2007 à 12:34:42  profilanswer
 

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
n°1617801
MagicBuzz
Posté le 02-10-2007 à 12:40:15  profilanswer
 

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

n°1617806
ails
Mwen ké trouvé un bon chimin
Posté le 02-10-2007 à 12:47:57  profilanswer
 

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
n°1617841
MagicBuzz
Posté le 02-10-2007 à 13:53:17  profilanswer
 

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 ;)

n°1617844
ails
Mwen ké trouvé un bon chimin
Posté le 02-10-2007 à 13:57:04  profilanswer
 

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


Message édité par ails le 02-10-2007 à 13:57:28
n°1617845
MagicBuzz
Posté le 02-10-2007 à 14:01:32  profilanswer
 

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
n°1617872
ails
Mwen ké trouvé un bon chimin
Posté le 02-10-2007 à 14:45:20  profilanswer
 

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
n°1617880
MagicBuzz
Posté le 02-10-2007 à 14:56:26  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
[Résolu] utiliser une table tempo pour lire un fichier .xls[RESOLU] Probleme pour augmenter un DIV en fonction d'un autre
[RÉSOLU]pre-loading - ActionScript 3.0[Résolu] IE "error not implemented"
[Résolu] DataBinding d'un DropDownList sur un GridViewpointillés autour animation flash [RESOLU]
[RESOLU] Débutant VB - Ouvrir une image sous VB6[Résolu] CSS : Sous menu rémanent
[resolu] simplexml - suppression d'elements - probleme avec unset?[Php/MySQL] - SELECT MAX(.. et GROUP BY, ca va pas :( [RESOLU!!!]
Plus de sujets relatifs à : req sql Max(id) + GROUP/[RESOLU]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR