2014-11-08 133 views
0

我想要计算在一定范围内入住的人数。所以不到7晚,7至14晚,最后超过14晚。没有来自SQL查询的结果

我想输出是这个样子:

Range   | Count 
---------------------- 
<= 7 Nights | 3 
8 - 14 Nights | 2 
15 Nights + | 1 

我使用MYSQL和尝试以下两种解决方案,但没有结果似乎不断出现。

SELECT 
CASE 
    WHEN booking_num_nights <= 7 THEN '<= 7 Nights' 
    WHEN booking_num_nights > 7 and booking_num_nights <= 14 THEN '8 - 14 Nights' 
    WHEN booking_num_nights > 14 THEN '15 Nights +' 
    END AS range, count(*) AS count_num 
FROM BOOKING 
    WHERE booking_property_id = :id 
    GROUP BY range 

另一尝试是如下:

SELECT booking_num_nights as range, count(*) as count_num 
FROM (SELECT 
    CASE 
     WHEN booking_num_nights <= 7 THEN '<= 7 Nights' 
     WHEN booking_num_nights > 7 and booking_num_nights <= 14 THEN '8 - 14 Nights' 
     WHEN booking_num_nights > 14 THEN '15 Nights +' 
    END AS range 
FROM BOOKING) 
WHERE booking_property_id = :id 
GROUP BY range 
+0

*“但没有结果似乎永远出现” * - 这个描述非常模糊。你会得到空的结果,或者是一个错误?如果是这样,请收集错误信息。对于另一种尝试,你甚至没有描述结果。另外,表格结构和示例数据也会有帮助,以及用于输入变量':id'的值。 – GolezTrol 2014-11-08 18:28:41

+0

我打印出来的JSON,当我输出到error_log我看到我的列名称,但没有任何数据的任何两次尝试。 – chrisalex2 2014-11-08 18:30:40

+0

如果没有错误,但也没有数据,问题不能在这种情况下,或分组。它是where子句过滤行。 where子句非常简单,所以唯一的原因可能是你根本没有为':id'指定一个好的值,或者指定了一个与'booking_property_id'不匹配的值。 – GolezTrol 2014-11-08 18:32:27

回答

0

rangereserved word。无论是使用不同的名称或逃避它:

SELECT 
    CASE 
     WHEN booking_num_nights <= 7 THEN '<= 7 Nights' 
     WHEN booking_num_nights > 7 and booking_num_nights <= 14 THEN '8 - 14 Nights' 
     WHEN booking_num_nights > 14 THEN '15 Nights +' 
    END AS `range`, count(*) AS count_num 
FROM BOOKING 
WHERE booking_property_id = :id 
GROUP BY `range` 

DEMO

+0

非常感谢!不敢相信我没有意识到这一点。完美的作品。 – chrisalex2 2014-11-08 18:33:04

+0

您应该从查询中收到语法错误。确保你设置了'PDO :: ERRMODE_EXCEPTION'。请参阅http://php.net/manual/en/pdo.error-handling.php – Barmar 2014-11-08 18:36:40