SQL。统计用户表按年龄范围

时间:2015-10-19 12:57:43

标签: sql

我有一个表格,其中包含我的平台用户的出生日期,我需要按年龄范围(18-25,25-35等)对后台统计项目进行排序。它们已按性别分类。

这是我的代码:

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;

但查询并没有用我的数据返回任何内容。

感谢您帮助我。

1 个答案:

答案 0 :(得分: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') 
    BETWEEN date_sub(curdate(), INTERVAL 26 YEAR) AND 
            date_sub(curdate(), INTERVAL 18 YEAR);

或者,您只需将现有条件中的规则切换为:

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