使用where带来所有类别的数据

时间:2013-09-12 07:56:12

标签: mysql sql

我有两个相关的表格,数据(不,姓名,城市代码,年龄)和城市(代码,城市)

表城市

  +------+------------+
  | code | city       |
  +------+------------+
  | A1   | Jakarta    |
  | A2   | Bali       |
  | A3   | Semarang   |
  | A4   | Surabaya   |
  | C1   | Dili       |
  | C2   | Jayapura   |
  | C3   | Yogyakarta |
  | C4   | Bandung    |
  +------+------------+

表数据

+----+--------+----------+------+
| no | name   | citycode | age  |
+----+--------+----------+------+
|  1 | Ony    | A3       |   27 |
|  2 | Abri   | A3       |   28 |
|  3 | Denny  | C4       |   27 |
|  4 | Febri  | C1       |   27 |
|  5 | Galih  | C3       |   28 |
|  6 | Yulia  | A2       |   26 |
|  7 | Zening | A1       |   25 |
+----+--------+----------+------+

我想计算一个城市27岁的员工人数

我的疑问:

 select city.city , count(data.name) as Nmb_of_employees
 from city
 left join
 data on data.citycode = city.code
 where data.age = 27
 group by city.city;

结果

+----------+------------------+
| city     | Nmb_of_employees |
+----------+------------------+
| Bandung  |                1 |
| Dili     |                1 |
| Semarang |                1 |
+----------+------------------+

但我想要的结果是这样的

+------------+------------------+
| city       | Nmb_of_employees |
+------------+------------------+
| Jakarta    |               0  |
| Bali       |               0  |
| Semarang   |               1  |
| Surabaya   |               0  |
| Dili       |               1  |
| Jayapura   |               0  |
| Yogyakarta |               0  |
| Bandung    |               1  |
+------------+------------------+

我应该使用什么查询来获得上述结果?

3 个答案:

答案 0 :(得分:2)

您需要删除WHERE子句,该子句会导致仅过滤员工年龄为27的记录。 SUM(age = 27)只是一个特定于mysql的语句,它基本上总结了表达式的布尔结果。它可以进一步修改为使用CASE,这是一个更友好的RDBMS,SUM(CASE WHEN age = 27 THEN 1 ELSE 0 END)

SELECT  a.City, IFNULL(SUM(age = 27), 0) Nmb_of_employees 
FROM    city a
        LEFT JOIN Data b
            ON a.code = b.cityCode
GROUP   BY a.City

答案 1 :(得分:1)

我想你想在ON条款中检查'年龄':

SELECT city.city , count(data.name) AS Nmb_of_employees
  FROM city
       LEFT JOIN data 
              ON data.citycode = city.code 
             AND data.age = 27
 GROUP BY city.city;

否则你正确地得到了表(带有空格),但随后用你的WHERE子句过滤了空白。

答案 2 :(得分:0)

SELECT DISTINCT city,count(name)FROM city m_t3 LEFT JOIN data m_t4 ON    年龄= 27岁    AND m_t3.code = m_t4.citycode   GROUP BY city