Mysql 有条件计数

Mysql 有条件计数,mysql,Mysql,我有一个针对不同国家的不同值的表,例如: id| country | =================== 1 | Argelia | 2 | USA | 1 | China | 1 | Italy | 1 | Italy | 1 | USA | 4 | USA | 1 | Argelia | id |国家| =================== 1 |阿格里亚| 2 |美国| 1 |中国| 1 |意大利| 1 |意大利| 1 |美国|

我有一个针对不同国家的不同值的表,例如:

id| country | =================== 1 | Argelia | 2 | USA | 1 | China | 1 | Italy | 1 | Italy | 1 | USA | 4 | USA | 1 | Argelia | id |国家| =================== 1 |阿格里亚| 2 |美国| 1 |中国| 1 |意大利| 1 |意大利| 1 |美国| 4 |美国| 1 |阿格里亚| 我只对一个国家的计数和总计数感兴趣,但我很难提出一个查询来完成它。此id 1查询的结果将是:

id| value_in_Italy | total ========================== 1 | 2 | 6 id |意大利价值|总计 ========================== 1 | 2 | 6
如你所见,我得到了意大利的价值,以及总价值。什么样的查询会为类似的表生成如上所示的行?

下面是加载的示例数据

SELECT A.ID,B.value_in_Italy,(SELECT COUNT(DISTINCT Country) AS total FROM YOURTABLE) AS          total
FROM YOURTABLE A,
(SELECT Country,COUNT(*) AS value_in_Italy
FROM YOURTABLE
WHERE COUNTRY='Italy'
GROUP BY Country) B
WHERE A.Country=B.Country
mysql> drop database if exists luqita;
Query OK, 1 row affected (0.03 sec)

mysql> create database luqita;
Query OK, 1 row affected (0.01 sec)

mysql> use luqita
Database changed
mysql> create table countrydata
    -> (
    ->     id int not null,
    ->     country varchar(32),
    ->     value int not null
    -> );
Query OK, 0 rows affected (0.10 sec)

mysql> insert into countrydata (id,country) values
    -> (1,'Argelia'  ),
    -> (2,'USA'      ),
    -> (1,'China'    ),
    -> (1,'Italy'    ),
    -> (1,'Italy'    ),
    -> (1,'USA'      ),
    -> (4,'USA'      ),
    -> (1,'Argelia'  );
Query OK, 8 rows affected, 1 warning (0.06 sec)
Records: 8  Duplicates: 0  Warnings: 1

mysql> select * from countrydata;
+----+---------+-------+
| id | country | value |
+----+---------+-------+
|  1 | Argelia |     0 |
|  2 | USA     |     0 |
|  1 | China   |     0 |
|  1 | Italy   |     0 |
|  1 | Italy   |     0 |
|  1 | USA     |     0 |
|  4 | USA     |     0 |
|  1 | Argelia |     0 |
+----+---------+-------+
8 rows in set (0.00 sec)

mysql>
只算意大利

select id,SUM(IF(country='Italy',1,0)) italy_count,COUNT(IF(id=1,1,0)) id_count
from countrydata WHERE id=1;
下面是对示例数据的查询

mysql> select id,SUM(IF(country='Italy',1,0)) italy_count,COUNT(IF(id=1,1,0)) id_count
 ->    from countrydata WHERE id=1;
+----+-------------+----------+
| id | italy_count | id_count |
+----+-------------+----------+
|  1 |           2 |        6 |
+----+-------------+----------+
1 row in set (0.00 sec)

mysql>
这是一个包罗万象的查询

select B.*,
    SUM(IF(A.country=B.country,1,0)) country_count,
    SUM(IF(B.id=A.id,1,0)) id_count
from
    countrydata A,
    (select distinct id,country from countrydata) B
group by B.id,B.country;
下面是执行的全包查询

mysql> select B.*,
    ->     SUM(IF(A.country=B.country,1,0)) country_count,
    ->     SUM(IF(B.id=A.id,1,0)) id_count
    -> from
    ->     countrydata A,
    ->     (select distinct id,country from countrydata) B
    -> group by B.id,B.country;
+----+---------+---------------+----------+
| id | country | country_count | id_count |
+----+---------+---------------+----------+
|  1 | Argelia |             2 |        6 |
|  1 | China   |             1 |        6 |
|  1 | Italy   |             2 |        6 |
|  1 | USA     |             3 |        6 |
|  2 | USA     |             3 |        1 |
|  4 | USA     |             3 |        1 |
+----+---------+---------------+----------+
6 rows in set (0.00 sec)

mysql>

下面是加载的示例数据

mysql> drop database if exists luqita;
Query OK, 1 row affected (0.03 sec)

mysql> create database luqita;
Query OK, 1 row affected (0.01 sec)

mysql> use luqita
Database changed
mysql> create table countrydata
    -> (
    ->     id int not null,
    ->     country varchar(32),
    ->     value int not null
    -> );
Query OK, 0 rows affected (0.10 sec)

mysql> insert into countrydata (id,country) values
    -> (1,'Argelia'  ),
    -> (2,'USA'      ),
    -> (1,'China'    ),
    -> (1,'Italy'    ),
    -> (1,'Italy'    ),
    -> (1,'USA'      ),
    -> (4,'USA'      ),
    -> (1,'Argelia'  );
Query OK, 8 rows affected, 1 warning (0.06 sec)
Records: 8  Duplicates: 0  Warnings: 1

mysql> select * from countrydata;
+----+---------+-------+
| id | country | value |
+----+---------+-------+
|  1 | Argelia |     0 |
|  2 | USA     |     0 |
|  1 | China   |     0 |
|  1 | Italy   |     0 |
|  1 | Italy   |     0 |
|  1 | USA     |     0 |
|  4 | USA     |     0 |
|  1 | Argelia |     0 |
+----+---------+-------+
8 rows in set (0.00 sec)

mysql>
只算意大利

select id,SUM(IF(country='Italy',1,0)) italy_count,COUNT(IF(id=1,1,0)) id_count
from countrydata WHERE id=1;
下面是对示例数据的查询

mysql> select id,SUM(IF(country='Italy',1,0)) italy_count,COUNT(IF(id=1,1,0)) id_count
 ->    from countrydata WHERE id=1;
+----+-------------+----------+
| id | italy_count | id_count |
+----+-------------+----------+
|  1 |           2 |        6 |
+----+-------------+----------+
1 row in set (0.00 sec)

mysql>
这是一个包罗万象的查询

select B.*,
    SUM(IF(A.country=B.country,1,0)) country_count,
    SUM(IF(B.id=A.id,1,0)) id_count
from
    countrydata A,
    (select distinct id,country from countrydata) B
group by B.id,B.country;
下面是执行的全包查询

mysql> select B.*,
    ->     SUM(IF(A.country=B.country,1,0)) country_count,
    ->     SUM(IF(B.id=A.id,1,0)) id_count
    -> from
    ->     countrydata A,
    ->     (select distinct id,country from countrydata) B
    -> group by B.id,B.country;
+----+---------+---------------+----------+
| id | country | country_count | id_count |
+----+---------+---------------+----------+
|  1 | Argelia |             2 |        6 |
|  1 | China   |             1 |        6 |
|  1 | Italy   |             2 |        6 |
|  1 | USA     |             3 |        6 |
|  2 | USA     |             3 |        1 |
|  4 | USA     |             3 |        1 |
+----+---------+---------------+----------+
6 rows in set (0.00 sec)

mysql>

我能想到的MySQL上最简单的查询是:

select id, sum(country = 'Italy') values_in_Italy, count(*) Total from t
where id = 1

MySQL不会强制您按id分组,因为它将不确定地获取一个id,但是
where
子句强制该列只具有一个id

我能想到的MySQL上最简单的查询是:

select id, sum(country = 'Italy') values_in_Italy, count(*) Total from t
where id = 1
MySQL不会强制您按id分组,因为它将不确定地获取一个id,但是
where
子句强制该列仅具有一个id

尝试以下操作:

select 1 id, sum(country = 'Italy') values_in_Italy, count(*) Total from t
试试这个:

select 1 id, sum(country = 'Italy') values_in_Italy, count(*) Total from t

你是如何创建格式良好的表格的?@I_uu:检查我的个人资料,我总是保留一些很酷的链接:)@I_uu:按下我帖子下方的“编辑”按钮,你就可以复制代码了。你是如何创建格式良好的表格的?@I__;:检查我的个人资料,我总是保留一些很酷的链接:)@I_u;:按我帖子下面的“编辑”按钮,你可以复制代码。我希望这有助于你的请求。我没有mysql来测试它。我希望这有助于你的请求。我没有mysql来测试它。只有在有行的情况下,你如何添加子句?例如,如果我没有'where id=1'子句,那么结果中只会显示id 1(因为其他的没有意大利计数),对不起,我不太明白这个问题。要在任何查询中仅显示意大利行,您应该使用此
where country='意大利语'
,如果这是您的意思的话。。。我的意思是“where values\u in\u意大利语>0”,鉴于上面的查询,仅当存在意大利语行时,如何添加子句?例如,如果我没有'where id=1'子句,那么结果中只会显示id 1(因为其他的没有意大利计数),对不起,我不太明白这个问题。要在任何查询中仅显示意大利行,您应该使用此
where country='意大利语'
,如果这是您的意思的话。。。根据上面的查询,我的意思是“where values\u in\u Italy>0”