2012-06-25 70 views
2

我在MySQL數據庫中有一張表,其中包含人們'pid'的ID以及這些人居住的城市名稱city。由於每個人在他/她的生活期間可能住在不止一個城市,因此一個人可以擁有該表中不止一個條目。如何在MySQL數據庫中查找滿足多個條件的條目的ID?

PID | CITY 
1 | Berlin 
1 | New York 

2 | Berlin 
2 | Oslo 
2 | New York 
2 | Mexiko City 

3 | Oslo 

4 | Berlin 
4 | Oslo 
4 | Bagdad 
4 | New York 
4 | Mexiko City 

有兩/三件事情,我想了解一下:

  1. 什麼是所有這些人的pid,那住在「柏林」,並在「紐約」 (結果應該是[1,2,4])
  2. 人們居住的其他城市是什麼,曾經住在「柏林」和「紐約」 (結果應該是[「奧斯陸」,「墨西哥城「,」巴格達「])
  3. 這將是更好的獲得數量,這些城市多久出現在表格中。 (結果應該是[ 「奧斯陸」 - > 2, 「Mexiko城」 - > 2, 「巴格達」 - > 1])

如何我要設計我的查詢,找出這些東西(而不是過度壓力我的數據庫服務器)?

+1

http://www.sqlfiddle.com/#!3/645ea – mellamokb

+0

看到這個問題(有超過10種不同的方式來實現你想要的):[如何過濾SQL結果中的多對一關係](http://stackoverflow.com/questions/7364969/how-to-filter-sql-results-in-一對多關係)和基準。 –

+0

你在數據中有3次「奧斯陸」。奧斯陸的數量應該是3,而不是2。 –

回答

2

1 )搜索這兩個城市,通過統計與列表中城市相匹配的記錄數,並查看它是否等於匹配的城市總數,找到匹配所有城市的所有pid

select 
    pid 
from 
    PlacesLived 
where 
    city in ('Berlin', 'New York') 
group by 
    pid 
having 
    count(*) = 2 

演示:http://www.sqlfiddle.com/#!3/645ea/1


2)查詢由(1)發現人居住的城市的獨特列表,減去您要驗證對(柏林&紐約)城市:

select distinct 
    city 
from 
    PlacesLived 
where pid in (
    select 
    pid 
    from 
    PlacesLived 
    where 
    city in ('Berlin', 'New York') 
    group by 
    pid 
    having 
    count(*) = 2 
) 
and city not in ('Berlin', 'New York') 

演示:http://www.sqlfiddle.com/#!3/645ea/3


3)添加組和計算得到的實際計數:

演示:http://www.sqlfiddle.com/#!3/645ea/4

2

你可以做所有這些事情在一個查詢:

SELECT 
    a.pid, 
    COALESCE(b.city, 'No other cities') AS othercity, 
    COUNT(c.city) AS OverallCityCount 
FROM 
    (
     SELECT pid 
     FROM tbl 
     WHERE city IN ('New York', 'Berlin') 
     GROUP BY pid 
     HAVING COUNT(*) = 2 
    ) a 
LEFT JOIN 
    tbl b ON a.pid = b.pid AND b.city NOT IN ('New York', 'Berlin') 
LEFT JOIN 
    tbl c ON b.city = c.city 
GROUP BY 
    a.pid, 
    b.city 

FROM子選擇答案問題1,在那裏只得到pid S其中他們居住在紐約柏林。

由於子查詢只會每pid返回一行,我們必須再次合併產生的pid對陣表來回答問題2(得到所有城市住了那些住在紐約和柏林的pid S) 。如果用戶既住在紐約,也住在柏林,但沒有其他城市,我們不想排除該pid,所以我們使用LEFT JOIN。如果沒有其他城市,city字段將只是No other cities

無論pid如何計算城市在整個表格中出現的次數,我們都會在city字段上再次自行加入表格。當這個連接發生時,pid -> city的組合將出現的次數與表中該城市的次數相同,因此爲了獲得計數,我們GROUP BY均爲pidcity,其中COUNT()給我們的次數爲這個城市出現在桌子上。如果有,該pid一直住在沒有其他城市,這個數將只是0

與樣品數據時,結果集看起來像:

pid | othercity  | OverallCityCount 
----------------------------------------- 
1 | No other cities | 0 
2 | Oslo    | 3 
2 | Mexiko City  | 2 
4 | Oslo    | 3 
4 | Bagdad   | 1 
4 | Mexiko City  | 2 

http://www.sqlfiddle.com/#!3/2bb23/2/0