[RESOLU]Afficher le plus grand ID de plusieurs sous_id

Afficher le plus grand ID de plusieurs sous_id [RESOLU] - SQL/NoSQL - Programmation

Marsh Posté le 27-02-2010 à 17:35:40    

Bonjour à toute la communauté HardWarienne. :hello:  
Pour moi c'est une première que de poster ici, ayant toujours trouvé les réponses à mes questions. Mais là ...... Rien. Pas mal de sujet s'approchent mais de trop loin (ou alors je n'arrive pas à adapter .... désolé).
C'est pour ça que je vers vous pour que vous puissiez m'éclairer de vos lumières Ô combien éblouissantes
 
Tout d'abord un grand merci à ceux et celle qui voudront bien lire mes propos et tenter de m'aider à me mettre sur la bonne voie, et mille et une excuse si je ne suis pas dans la bonne section ..... :sweat:  
 
Je tiens à faire savoir que je ne suis pas totalement Newbie mais pas expert pour un rond non plus => je n'ai que quelques notion de requète Mysql et PHP.
 
J'ose espérer que le titre sera assez clairs mais je m'explique.
Je suis donc sous php, avec une bdd mysql.
Pour simplifier disons que j'ai une table fruit avec comme champ :
-id_fruit autoincrement
-id_typefruit (smallint) (=> renvoit à une table typefruit par une jointure pour avoir le nom)
-id_fruitpoid (smallint)
-id_fruitdate(date)
 
il est possible d'avoir les enregistrements :
 
id_fruit | id_typefruit | id_fruitpoid | id_fruitdate |
-----------------------------------------------
    1    |        1        |       312     | 2010/02/01 |
    2    |        1        |       152     | 2010/02/21 |
    3    |        1        |       317     | 2010/02/22 |
    4    |        2        |       87      | 2010/02/17 |
    5    |        2        |       367     | 2010/02/20 |
    6    |        3        |       287     | 2010/02/03 |
    7    |        1        |       256     | 2010/02/18 |
    8    |        2        |       213     | 2010/02/18 |
    9    |        3        |       152     | 2010/02/06 |
   10   |        2        |       717     | 2010/02/16 |
 
Je cherche donc à afficher le poid le plus grand de chaqu'un de mes fruits... sans tenir compte de la date (qui correpond à un date d'achat, pas de saisie...) mais ordonné par type de fruit
Cela devrai me donner :
le 22/02/2010 achat de 317 Kg de pommes (=> id_fruit=3 | id_typefruit=1 | id_poidfruit=317)
le 16/02/2010 achat de 717 Kg de fraises (=> id_fruit=10 | id_typefruit=2 | id_poidfruit=717)
le 03/02/2010 achat de 287 kg de bananes (=> id_fruit=6 | id_typefruit=3 | id_poidfruit=287)
 
J'avoue que je tourne en rond :pt1cable:  depuis quelques jours et vos idées seront les bienvenues... :)  
 
Par avance merci .....


Message édité par Bitibulleur le 02-03-2010 à 19:11:43

---------------
Il faut être fou pour parvenir à ses fins.. car seul un fou sait que tout est possible
Reply

Marsh Posté le 27-02-2010 à 17:35:40   

Reply

Marsh Posté le 27-02-2010 à 18:18:20    

J'sais pas si ya une différence avec mysql mais sous oracle ca serait:
select id_typefruit, max(id_fruitpoid) from fruit group by id_typefruit

 

Après, pour récupérer les autres infos, tu utilises ca dans une autre requete:
select id_fruitdate, id_fruitpoid, id_typefruit from fruits where id_typefruit in (select id_typefruit, max(id_fruitpoid) from fruit group by id_typefruit) order by id_typefruit

 

Pour la partie chieur, je dirais:
- poids ca prend un s
- revois ta convention de nommage, les noms de colonne c'est une horreur


Message édité par lasnoufle le 27-02-2010 à 18:19:33

---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 27-02-2010 à 18:30:58    

Je te remercie 'lasnoufle' de t'être penché sur le sujet et de ta réponse.
Je sais que les noms ne sont pas "top", mais c'était pour l'exemple et pour simplifier.
Pour un résumé un peu plus poussé, il s'agit de récupérer les résultats de différentes équipes avec, pour la table appelée calendrier, les champ :
 id (autoincrément)-equ_id-day-pour-contre
 
et ce que je cherche à récupérer, c'est le max(day) de chaque equ_id where pour>0 or contre>0  
en simplifiand un peu car j'ai en plus des jointures pour récupéer le nom des équipes en questions.
Et comme tout est variable (aussi bien le nombre de 'equ_id' que de 'day')... je sêche ...
Mais je vais tester effectivement ta solution ...
 
=> je viens de tester ... mais erreur de 'operande' (normal apparement car une seule clause WHERE ..
Par contre je ne vois pas la relation entre le premier select et le second .... (la clause IN je connaissais pas) pusique le premier est intégralement repris ..
 
J'avoue mon ignorance (et aussi ma fatigue ......)

Message cité 1 fois
Message édité par Bitibulleur le 27-02-2010 à 18:57:33

---------------
Il faut être fou pour parvenir à ses fins.. car seul un fou sait que tout est possible
Reply

Marsh Posté le 02-03-2010 à 13:52:04    

Bitibulleur a écrit :

Je te remercie 'lasnoufle' de t'être penché sur le sujet et de ta réponse.
Je sais que les noms ne sont pas "top", mais c'était pour l'exemple et pour simplifier.
Pour un résumé un peu plus poussé, il s'agit de récupérer les résultats de différentes équipes avec, pour la table appelée calendrier, les champ :
 id (autoincrément)-equ_id-day-pour-contre
 
et ce que je cherche à récupérer, c'est le max(day) de chaque equ_id where pour>0 or contre>0  
en simplifiand un peu car j'ai en plus des jointures pour récupéer le nom des équipes en questions.
Et comme tout est variable (aussi bien le nombre de 'equ_id' que de 'day')... je sêche ...
Mais je vais tester effectivement ta solution ...
 
=> je viens de tester ... mais erreur de 'operande' (normal apparement car une seule clause WHERE ..
Par contre je ne vois pas la relation entre le premier select et le second .... (la clause IN je connaissais pas) pusique le premier est intégralement repris ..
 
J'avoue mon ignorance (et aussi ma fatigue ......)


Salut,
C'est la bonne méthode qui t'a été proposée.
Premièrement un GROUP BY pour récupérer les enregistrements "probants" :

Code :
  1. SELECT equ_id, max(day) FROM calendrier GROUP BY equ_id WHERE pour > 0 AND contre > 0


Cette requête te ramène les id des équipes avec le jour le plus grand
 
Mais en fait ce que tu veux est un peu plus compliqué donc il faut imbriquer cette requête dans une autre :

Code :
  1. SELECT equ_id, equ_nom, jour FROM equipe
  2. JOIN (
  3.   SELECT equ_id, MAX(day) AS jour FROM calendrier GROUP BY equ_id WHERE pour > 0 AND contre > 0
  4. ) jours ON jours.equ_id = equipe.equ_id


Avec ça tu auras l'id de l'équipe, son nom, et le jour max.
Si tu veux voir toutes les équipes, même celles qui n'ont aucune entrée dans "calendrier", remplace le JOIN par un LEFT JOIN
Bon je sais pas trop ce qu'il y a dans tes tables donc je sais pas si ça va marcher... mais c'est le principe.
 
C'est difficile de t'aider car je trouve tes explications un peu confuses. Le plus simple serait de nous donner la structure de tes tables pour qu'on puisse voir exactement ce que tu essaies de faire.

Reply

Marsh Posté le 02-03-2010 à 19:09:56    

Merci pour vos lumières.
Avec votre aide et un peu de reflexion/repos, j'ai pu "pondre" ceci :

Code :
  1. $req = mysql_query("SELECT * FROM (SELECT * FROM calendrier WHERE pour > 0 || contre > 0 ORDER BY date DESC) AS t LEFT OUTER JOIN equipe ON equ_id=IDequ LEFT OUTER JOIN adversaire ON adv=IDadv GROUP BY equ_id " ) or die (mysql_error());
  2. while($res=mysql_fetch_array($req))
  3. {
  4. ....


 
Je ne pense pas avoir été trop "sale" dans mon code.
En tout cas ça fonctionne comme je le voulais.
 
J'avoue que je ne connaissais pas l'mbrcation de requètes .... En regardant de plus près quelques autres page du site (que je reprends après le départ du concepteur, qui en connaissait autant que moi) il y aurait plein de lignes à reprendre (requete que s'effetue en fontion d'une requete s'effectuant d'après une 3°...) => c'est une autre histoire !
 
Merci encore...
 
PS : question à 2cts => comment afficher "résolu" ?

Reply

Sujets relatifs:

Leave a Replay

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