Aide MySQL pour regroupement par intervalles


OJAL
WRInaute passionné
WRInaute passionné
 
Messages: 1178
Inscription: 10 Avr 2003

Aide MySQL pour regroupement par intervalles

Message le Sam Juin 23, 2007 8:58

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


Bh@Mp0
WRInaute discret
WRInaute discret
 
Messages: 245
Inscription: 18 Jan 2005

Message le Sam Juin 23, 2007 9:15

Bourrinons !

Code: Tout sélectionner
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 ...


OJAL
WRInaute passionné
WRInaute passionné
 
Messages: 1178
Inscription: 10 Avr 2003

Message le Sam Juin 23, 2007 10:02

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.


Bh@Mp0
WRInaute discret
WRInaute discret
 
Messages: 245
Inscription: 18 Jan 2005

Message le Sam Juin 23, 2007 10:51

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: Tout sélectionner
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);


OJAL
WRInaute passionné
WRInaute passionné
 
Messages: 1178
Inscription: 10 Avr 2003

Message le Sam Juin 23, 2007 13:08

Merci ;-)

Je vais essayer de partir de cette trame.
Fabuleux les aides sur WRI ;-)


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité