2015-10-19 35 views
0

我有一个表格,列出了我的平台用户的出生日期,我需要根据年龄段(18-25,25-35等)对后台统计项目进行排序。他们已经按性别分类。SQL。统计按年龄段的用户列表

这里是我的代码:

public function GenreByAge() { 


     $date_day = new datetime(); 
     $date_day = $date_day->format('Y-m-d'); 


     $sql = "SELECT count(*) as nb, id_thematique, dn 
       FROM qr_thematique_preco q 
       INNER JOIN users as u ON u.id_user = q.id_membre 
       WHERE u.id_part = '$this->id_part' 
       AND u.sexe = '$this->genre'"; 


     switch ($this->tranche_age) { 

      case 1: 

       $sql .= AND DATE_FORMAT(dn,'%Y-%m-%d') <= date_sub(curdate(), INTERVAL 18 YEAR) 
         AND DATE_FORMAT(dn,'%Y-%m-%d') > date_sub(curdate(), INTERVAL 26 YEAR); 

       break; 


      case 2: 

       $sql .= AND dn <= date_sub(curdate(), INTERVAL 26 YEAR) 
         AND dn > date_sub(curdate(), INTERVAL 36 YEAR); 

       break; 


      case 3: 

       $sql .= AND dn <= date_sub(curdate(), INTERVAL 36 YEAR) 
         AND dn > date_sub(curdate(), INTERVAL 46 YEAR); 

       break; 


      case 4: 

       $sql .= AND dn <= date_sub(curdate(), INTERVAL 46 YEAR) 
         AND dn > date_sub(curdate(), INTERVAL 56 YEAR); 

       break; 


      case 5: 

       $sql .= AND dn <= date_sub(curdate(), INTERVAL 56 YEAR) 
         AND dn > date_sub(curdate(), INTERVAL 66 YEAR); 

       break; 

但查询不返回我的数据什么。

感谢您的帮助。

+0

是否使用的是DBMS:

AND DATE_FORMAT(dn,'%Y-%m-%d') BETWEEN date_sub(curdate(), INTERVAL 26 YEAR) AND date_sub(curdate(), INTERVAL 18 YEAR); 

或者,你可以切换规则,在你现有的条件? –

回答

0

你写错了你的WHERE条件,它们是互斥的。

例如,出生日期不能同时小于过去18年和过去26年以上。

AND DATE_FORMAT(dn,'%Y-%m-%d') <= date_sub(curdate(), INTERVAL 18 YEAR) 
AND DATE_FORMAT(dn,'%Y-%m-%d') > date_sub(curdate(), INTERVAL 26 YEAR); 

(一个人不能年龄小于18岁,同时年龄大于26岁)。

如果您想要生成捕获特定日期范围的日期间隔,建议您使用BETWEEN

AND DATE_FORMAT(dn,'%Y-%m-%d') >= date_sub(curdate(), INTERVAL 18 YEAR) 
AND DATE_FORMAT(dn,'%Y-%m-%d') < date_sub(curdate(), INTERVAL 26 YEAR); 
+1

它的工作原理。非常感谢你。我会永远责怪自己这样一个明显的错误!猜猜我会在咖啡馆放慢速度。 – Mateus

+0

@Mateus好吧,这只是一个小小的改变。请不要忘记“奖励”。 –

+0

@mateus或者可能增加咖啡因:) – logixologist