MAX, MIN retourne un tableau

MAX, MIN retourne un tableau - SQL/NoSQL - Programmation

Marsh Posté le 18-12-2010 à 16:22:22    

Bonjour,
 
J'ai une base avec par exemple 3 colonnes : pays, continent, population. Je cherche à retourner sous la forme d'un tableau avec ces 3 colonnes la population maximale du pays en fonction du continent
 
Si je tape cette requête :

Code :
  1. <?php
  2. $select = 'SELECT pop,cont,pays FROM bddpays WHERE pop=(SELECT MAX(pop) FROM bddpays) order by cont';
  3. $result = mysql_query($select) or die ('Erreur : '.mysql_error() );
  4. $total = mysql_num_rows($result);
  5. if($total) {
  6. echo '<table bgcolor="#FFFFFF">'."\n";echo '<tr>';
  7. echo '<td bgcolor="#669999"><b>Population</b></td>';
  8. echo '<td bgcolor="#669999"><b>Continent</b></td>';
  9. echo '<td bgcolor="#669999"><b>Pays</b></td>';
  10. echo '</tr>'."\n";
  11. while($row = mysql_fetch_array($result)) {
  12. echo '<tr>';
  13. echo '<td bgcolor="#CCCCCC">'; if (empty($row['pop'])) echo 'Non Disponible'; else echo number_format($row['pop'], 0, ',', '.') ; echo '    </td>';
  14. echo '<td bgcolor="#CCCCCC">'.$row["cont"].'</td>';
  15. echo '<td bgcolor="#CCCCCC">'.$row["pays"].'</td>';
  16. echo '</tr>'."\n";
  17.     }
  18. echo '</table>'."\n";
  19. }
  20. else echo 'Pas d\'enregistrements dans cette table...';
  21. mysql_free_result($result);
  22. ?>


 
Voici le résultat (une seule ligne correspondant au pays le plus peuplé de la base)
Population; Continent; Pays  
1.330.044.605;  asie; chine  
 
 
 
 
Mais si je fais ceci :

Code :
  1. <?php
  2. $select = 'SELECT MAX(pop),cont,pays FROM bddpays GROUP BY cont';
  3. $result = mysql_query($select) or die ('Erreur : '.mysql_error() );
  4. $total = mysql_num_rows($result);
  5. if($total) {
  6. echo '<table bgcolor="#FFFFFF">'."\n";echo '<tr>';
  7. echo '<td bgcolor="#669999"><b>Population</b></td>';
  8. echo '<td bgcolor="#669999"><b>Continent</b></td>';
  9. echo '<td bgcolor="#669999"><b>Pays</b></td>';
  10. echo '</tr>'."\n";
  11. while($row = mysql_fetch_array($result)) {
  12. echo '<tr>';
  13. echo '<td bgcolor="#CCCCCC">'; if (empty($row['MAX(pop)'])) echo 'Non Disponible'; else echo number_format($row['MAX(pop)'], 0, ',', '.') ; echo '    </td>';
  14. echo '<td bgcolor="#CCCCCC">'.$row["cont"].'</td>';
  15. echo '<td bgcolor="#CCCCCC">'.$row["pays"].'</td>';
  16. echo '</tr>'."\n";
  17.     }
  18. echo '</table>'."\n";
  19. }
  20. else echo 'Pas d\'enregistrements dans cette table...';
  21. mysql_free_result($result);
  22. ?>


 
le résultat me retourne bien la population maximale par continent mais il y a une erreur pour le pays. Le pays affiché est en en fait le premier dans l'ordre alphabétique et non celui qui a la plus grande population...
Population; Continent; Pays  
138.283.240;  afrique; afrique-du-sud   -> le résultat devrait être nigeria
303.824.646;  ameriques; anguilla         -> ici USA
1.500;  antarctique; antarctique  
1.330.044.605;  asie; afghanistan         -> chine
140.702.094;  europe; albanie  
20.600.856;  oceanie; australie  
 
 
Auriez-vous une solution pour afficher le nom du pays relatif à la population maximale et à son continent ?
 
Merci par avance,

Reply

Marsh Posté le 18-12-2010 à 16:22:22   

Reply

Marsh Posté le 18-12-2010 à 20:03:01    

SELECT  
cont,pays,population  
FROM bddpays bp
WHERE population = ( SELECT max(b2.population) FROM bddpays bp2 where bp2.cont = bp.cont)

Reply

Marsh Posté le 19-12-2010 à 12:27:39    

A chaque fois que vous faites une sous-requête corrélée, Dieu tue un chaton.  
 
Depuis le temps qu'on le répète que les sous-requetes c'est LE MAL  :fou:  :fou:  :fou:  
 
C'est l'Instrument des Légions de Satan destiné à tourmenter les DBA dans le "7ième Enfer des Requetes Lentes"
 
La méthode correcte est de faire un "left join ... where is null"
 

SELECT bp.cont, bp.pays, bp.population  
FROM bddpays bp  
LEFT JOIN bddpays bp2 ON bp2.cont = bp.cont AND bp.population < bp2.population
WHERE bp2.cont IS NULL

Message cité 1 fois
Message édité par smaragdus le 19-12-2010 à 12:29:40
Reply

Marsh Posté le 19-12-2010 à 12:42:16    

Ok pas de sous-requête corrélée..
 
Par contre, je ne suis pas assez calée en SQL pour comprendre cette nouvelle requête.  
 
Actuellement, tout est dans une même base. A quoi correspond bp ? Faut-il que je crée cette base, mais avec quoi dedans ?

Reply

Marsh Posté le 20-12-2010 à 21:21:45    

Personne pour m'expliquer en quelques mots ou même un lien ?

Reply

Marsh Posté le 20-12-2010 à 21:28:40    

bd est un alias pour la table bddpays  
la requete de smaragdus est en fait construite en se disant qu'il cherche un element de bdd pays qui n'en a aucun de plus grand

Reply

Marsh Posté le 20-12-2010 à 23:13:51    

smaragdus a écrit :

A chaque fois que vous faites une sous-requête corrélée, Dieu tue un chaton.  
 
Depuis le temps qu'on le répète que les sous-requetes c'est LE MAL  :fou:  :fou:  :fou:  
 
C'est l'Instrument des Légions de Satan destiné à tourmenter les DBA dans le "7ième Enfer des Requetes Lentes"
 
La méthode correcte est de faire un "left join ... where is null"
 

SELECT bp.cont, bp.pays, bp.population  
FROM bddpays bp  
LEFT JOIN bddpays bp2 ON bp2.cont = bp.cont AND bp.population < bp2.population
WHERE bp2.cont IS NULL



 
Merci pour le fou rire !!!  :love:   :lol:  :lol:  :lol:  :lol:  :lol:  :sol:

Reply

Sujets relatifs:

Leave a Replay

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