Aide MySQL pour regroupement par intervalles

  • Auteur de la discussion Auteur de la discussion OJAL
  • Date de début Date de début
WRInaute impliqué
Bonjour,

Je souhaite trouver la requête SQL qui me permettra d'extraire le nombre d'annonces par intervalles de surfaces avec par exemple des intervalles de surfaces de 0 à 40 puis 40 à 70 puis tout ce qui est sup à 70 par exemple...
Je sais le faire en autant de requêtes que d'intervalles, mais j'aurais besoin de le faire en une seule requête.

Merci par avance pour votre aide ;-)
 
WRInaute discret
Bourrinons !

Code:
SELECT COUNT(DISTINCT t1.id) AS countGroup1, COUNT(DISTINCT t2.id) AS countGroup2, COUNT(DISTINCT t3.id) AS countGroup3
FROM myTable t1
LEFT JOIN myTable t2
LEFT JOIN myTable t3
WHERE t1.surface BETWEEN 0 AND 40
AND t2.surface BETWEEN 40 AND 70
AND t3.surface > 70

A tester et à vérifier, car j'ai un gros doute ...
 
WRInaute impliqué
Merci Bh@Mp0,

J'ai donné les intervalles pour exemple :oops: En fait j'aurai besoin de beaucoup plus d'intervalles...
Il faut peut être simplement que je fasse une requête par intervalle sans plus me casser la tête avec des between... 10 intervalles, 10 requêtes.
 
WRInaute discret
Euh bah non ... faut surtout que tu construises automatiquement la requête à partir, par exemple, d'un tableau où tu donnes les limites.

Genre :
Code:
function buildRequest($myLimits) {

     $selects = "";
     $tables = "";
     $wheres = "";

     for($i=0;$i<count($myLimits);$i++) {
          $selects .= "COUNT(DISTINCT t".$i.".id) AS countGroup".$i.", ";
          $tables .= "myTable t".$i." LEFT JOIN ";
          if($myLimits[$i][0] == null) $wheres .= "t".$i.".surface < ".$myLimits[$i][1]." AND ";
          elseif($myLimits[$i][1] == null) $wheres .= "t".$i.".surface > ".$myLimits[$i][0]." AND ";
          else $wheres .= "t".$i." BETWEEN ".$myLimits[$i][0]." AND ".$myLimits[$i][1]." AND ";
     }

     // on vire le dernier ", "
     $selects = substr($selects, 0, strlen($selects)-2);
     // on vire le dernier " LEFT JOIN "
     $tables = substr($tables, 0, strlen($tables)-11);
     // on vire le dernier " AND "
     $wheres = substr($wheres, 0, strlen($wheres)-5);

     return "SELECT ".$selects." FROM ".$tables." WHERE ".$wheres;
}

// maintenant on construit nos limits
$limits = array(
     array(null,40),
     array(40,70),
     array(70,null),
     array(80,81),
     array(1,100)
);
// et on appelle la fonction qui crée la requête
$request = buildRequest($limits);

// on va l'afficher pour l'instant, afin de tester
print_r($request);
 
Discussions similaires
Haut