2012-06-06 35 views
0

想象一下三列表,比如說TRAVELS,其中列表NAMECOUNTRY他們曾經去過,而DATE,這樣就可以有重複的NAME + COUNTRY行。如何嵌套兩個count()語句?

- >我不想顯示實際NAME值,也沒有實際COUNTRY值 - 只是他們計數,只爲那些已探訪超過1個國家。

這將是像這樣的列表:

| 9 | 2 | 意思9人已訪問2個國家,
| 4 | 3 | 意思4人已訪問3個國家,
| 2 | 4 | 意味着2人訪問了4個國家,

我在SQL很糟糕,但我想我需要建立某種嵌套查詢的:

select count(t1.NAME) 
from TRAVELS t1 
where (
    select count(distinct COUNTRY) 
    from TRAVELS t2 
    where t1.name = t2.name 
    and count(t2.COUNTRY) > 1 
) 

顯然這不起作用,但我希望它顯示我的一般意圖。我一直無法找到任何關於這種嵌套雙數的東西,儘管一旦我看到它可能很簡單。

回答

1
select country_count, count(*) as people_count 
    from (select name, count(distinct country) as country_count 
      from travels 
     group by name 
     having count(distinct country) > 1) 
group by country_count 

當然這假定名稱是唯一的。如果不是,你可能想用user_id代替名字。

+0

我喜歡這個方案,因爲它更易於閱讀。我只需添加'my_table'來讓MySQL接受查詢。 –

2

這裏試試:http://sqlfiddle.com/#!2/b0762/3

查詢:

select 
    count(*) as people, 
    countries_visited 
from (
    select 
     name, 
     count(distinct country) as countries_visited 
    from travels 
    group by name 
    having count(distinct country) > 1 
) s 
group by countries_visited 
order by people desc, countries_visited desc 
+0

@TorbenGundtofteBruun,我的解決方案適合您嗎?如果是,那麼你能接受答案嗎? – spatar

+0

給我一個睡覺的機會,閱讀你的答案,試試看,並回應:-) –

+0

是的,它的工作原理。與接受的答案相比,結果中的列被交換。 –