2011-08-11 208 views
2

我確定有一個簡單的解決方案,但我根本找不到它。Mysql加入查詢

我有一個照片的表格,其中有與他們相關的州和國家。 我有兩個簡單的查詢,一個讓每個國家的照片數量:

select country, count(*) from photos group by country; 

+-------------+----------+ 
| country  | count(*) | 
+-------------+----------+ 
| Argentina |  6 | 
| Australia |  5 | 
| Chile  |  3 | 
| Ecuador  |  10 | 
| France  |  1 | 
| Hong Kong |  4 | 
| Indonesia |  6 | 
| Ireland  |  16 | 
| Malaysia |  1 | 
| New Zealand |  3 | 
| Peru  |  8 | 
+-------------+----------+ 

其他獲得的每個州的照片(和國家)的數量:

select country, state, count(*) from photos group by country, state; 

+-------------+---------------------+----------+ 
| country  | state    | count(*) | 
+-------------+---------------------+----------+ 
| Argentina | Misiones   |  2 | 
| Argentina | Salta    |  4 | 
| Australia | New South Wales  |  1 | 
| Australia | Victoria   |  4 | 
| Chile  | Antofagasta   |  3 | 
| Ecuador  | Galapagos   |  5 | 
| Ecuador  | Sucumbios   |  5 | 
| France  | Aquitaine   |  1 | 
| Hong Kong | Hong Kong   |  4 | 
| Indonesia | Bali    |  3 | 
| Indonesia | Nusa Tenggara Barat |  1 | 
| Indonesia | Yogyakarta   |  2 | 
| Ireland  | Antrim    |  1 | 
| Ireland  | Cork    |  1 | 
| Ireland  | Derry    |  2 | 
| Ireland  | Donegal    |  8 | 
| Ireland  | Kerry    |  1 | 
| Ireland  | Sligo    |  1 | 
| Ireland  | Waterford   |  1 | 
| Ireland  | Wexford    |  1 | 
| Malaysia | Sabah    |  1 | 
| New Zealand | Manawatu   |  2 | 
| New Zealand | Westland   |  1 | 
| Peru  | Cusco    |  6 | 
| Peru  | La Libertad   |  2 | 
+-------------+---------------------+----------+ 

我想什麼做的是執行這些查詢導致以下聯接:

+-------------+---------------------+----------+----------+ 
| country  | state    | statet | countryt | 
+-------------+---------------------+----------+----------+ 
| Argentina | Misiones   |  2 |  6 | 
| Argentina | Salta    |  4 |  6 | 
| Australia | New South Wales  |  1 |  5 | 
| Australia | Victoria   |  4 |  5 | 
| Chile  | Antofagasta   |  3 |  3 | 
| Ecuador  | Galapagos   |  5 |  10 | 
| Ecuador  | Sucumbios   |  5 |  10 | 
| France  | Aquitaine   |  1 |  1 | 
| Hong Kong | Hong Kong   |  4 |  4 | 
| Indonesia | Bali    |  3 |  6 | 
| Indonesia | Nusa Tenggara Barat |  1 |  6 | 
| Indonesia | Yogyakarta   |  2 |  6 | 
| Ireland  | Antrim    |  1 |  16 | 
| Ireland  | Cork    |  1 |  16 | 
| Ireland  | Derry    |  2 |  16 | 
| Ireland  | Donegal    |  8 |  16 | 
| Ireland  | Kerry    |  1 |  16 | 
| Ireland  | Sligo    |  1 |  16 | 
| Ireland  | Waterford   |  1 |  16 | 
| Ireland  | Wexford    |  1 |  16 | 
| Malaysia | Sabah    |  1 |  1 | 
| New Zealand | Manawatu   |  2 |  3 | 
| New Zealand | Westland   |  1 |  3 | 
| Peru  | Cusco    |  6 |  8 | 
| Peru  | La Libertad   |  2 |  8 | 
+-------------+---------------------+----------+----------+ 

我一直在玩了一上午的連接和無法弄清楚,任何指針將是真正appre ciated!

回答

0

這應該可以做到。

SELECT country_state.country, country_state.state, 
     country_state.statet, country.countryt 
FROM 
(SELECT country, count(*) as countryt FROM photos group by country) AS country 
JOIN 
(SELECT country, state, count(*) as statet FROM photos group by country, state) AS country_state ON country.country = country_state.country 
0

嘗試

select * 
from (
    select country, state, count(*) from photos group by country, state 
) a 
inner join (
    select country, count(*) from photos group by country 
) b on a.country = b.country 
1

就個人而言,我會去的子查詢:

select 
    country, 
    state, 
    count(*) as state, 
    (select count(*) from photos inr 
      where inr.country = otr.country) 
from photos otr group by country, state; 
+0

WHERE需要在子查詢中替換HAVING。 – adamcodes

1

它是否如你預期的工作?

SELECT country, state, COUNT(DISTINCT country), COUNT(state) 
    FROM photos 
    GROUP BY country, state 

此外,嘗試刪除DISTINCT關鍵字,如果你需要爲每個不同的狀態

+0

這不太可能工作 – ajreal

+0

可能是,它會返回COUNTRY - STATE - NUMBER_OF_COUNTRIES - NUMBER_OF_STATE_PER_COUNTRY,通過移除DISTING國家,您可能會獲得更多的擴展視圖 – sll

+0

這將始終返回1爲國家,因爲'country-state'中的每個記錄是總是有相同的國家 – ajreal

1
select cs.country, cs.state, count(*) as statet, c.countryt 
from photos cs 
left join (select country, count(*) countryt from photos group by country) as c 
on c.country=cs.country 
group by cs.country, cs.state; 
0

算同一個國家我的解決方案,測試,應該給予確切的結果:

SELECT a.country AS country, p.state AS state, COUNT(*) AS statet, a.count AS countryt 
FROM (SELECT p1.country, COUNT(*) AS count FROM photos p1 GROUP BY p1.country) a 
JOIN photos p ON (p.country = a.country) 
GROUP BY p.state; 

請享用!

0

爲避免必須重複查詢表格兩次,可以使用分析。

​​