2012-03-19 73 views
2

我有一个表,在不同的国家不同的值计数,例如:与条件

 
id| country | 
=================== 
1 | Argelia | 
2 | USA  | 
1 | China | 
1 | Italy | 
1 | Italy | 
1 | USA  | 
4 | USA  | 
1 | Argelia | 

我感兴趣的只有一个国家的数量,总数量,但我有未来与烦恼一个单一的查询来做到这一点。此查询ID 1的结果将是:

 
id| value_in_Italy | total 
========================== 
1 | 2    | 6 

正如你所看到的,我得到了意大利的价值,以及总价值。什么样的查询会产生像上面那样的类似表的行?

+0

你是如何创建很好格式化的表? – 2012-03-19 18:03:32

+0

你有吗? – 2012-03-19 18:14:08

+0

@I__:检查我的个人资料,我总是保持一些很酷的链接:) – 2012-03-19 18:19:47

回答

2

,关于MySQL的工作我能想到的是最简单的查询:

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

MySQL不会强迫你group by id因为它将非确定性地取一个ID,但where子句强制该列只有一个ID

+0

只有在有意大利的行时才会添加一个子句?例如,如果我没有使用'where id = 1'子句,只有id 1会显示在结果中(因为其他的没有意大利计数) – luqita 2012-03-19 18:36:42

+0

对不起,但我没有完全明白这个问题。要在任何查询中只显示意大利的行,你应该使用'where country ='Italy'',如果这就是你的意思。 – 2012-03-19 18:44:13

+0

,只会计算意大利的行数,尽管...我的意思是像'where values_in_Italy> 0'给出您的查询以上 – luqita 2012-03-19 18:50:58

1
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 
+1

我希望这可以帮助你的req.I不必有MySQL来测试它。 – Teja 2012-03-19 18:04:13

+2

您可以使用[SQLFiddle](http://sqlfiddle.com/)。 – 2012-03-19 18:05:30

1

这里是加载

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> 
0

试试这个:

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