2016-08-19 26 views
0

值我有兩個相關的表:顯示最出現

(1)包含姓名和圖像文件。

(2)城市包含他們訪問過的城市。

id name  image 
1 John  NULL 
2 Carrie 001.jpg 
3 Desmond 002.jpg 
4 Harry 003.jpg 
5 Paul  NULL 

城市

id city  people_id year_visited 
1 Chicago 1   2000 
2 Chicago 4   2000 
3 Chicago 5   2001 
4 Paris  1   2000 
5 Paris  2   2002 
6 Chicago 4   2002 
7 Chicago 1   2001 
8 London 1   2004 
9 Sydney 5   2001 
10 Sydney 1   2002 
11 Rio  5   2002 
12 London 5   2004 
13 Sydney 5   2003 
14 Sydney 5   2005 

我想找出所有的人都沒有圖像,以及城市,他們參觀了最。所以我要尋找的結果是:

name most_visited_city number_of_visits 
John Chicago   2 
Paul Sydney   3 

我可以GROUP_CONCAT他們參觀了城市,但低於他們參觀了最不深入到單個城市。

感謝所有幫助。

回答

0

下面讓人們,城市和計數:

select p.id, c.city, count(*) as cnt 
from people p join 
    cities c 
    on p.id = c.people_id 
where p.image is null 
group by p.id, c.city; 

有關參觀人數最多的獲取信息是在MySQL棘手。這裏有一個方法,如果數據不是太大的作品:

select id, 
     substring_index(group_concat(city order by cnt desc separator '|'), '|', 1) as most_visited_city, 
     max(cnt) as number_of_times_visited 
from (select p.id, c.city, count(*) as cnt 
     from people p join 
      cities c 
      on p.id = c.people_id 
     where p.image is null 
     group by p.id, c.city 
    ) pc 
group by id; 
+0

謝謝。我實際上使用了你的初始查詢(這是c.city的額外分組,我錯過了),並且包裝在一個外部select語句中: 'select * from( select p.id,c.city,count (*)從人們p CNT 加入 城市ç 上p.id = c.people_id 其中p.image爲空 組由p.id,c.city 爲了通過CNT遞減 )T1組由t1.id' 最後兩行留給我的是個人身份證和他們訪問量最大的城市。再次感謝! – huey

0

該查詢應該返回最多的城市每個people_idcities

SELECT t1.people_id, t2.city, t2.visits 
FROM (
    SELECT people_id, MAX(visits) AS max_visits 
    FROM (
     SELECT people_id, city, COUNT(*) AS visits 
     FROM cities 
     GROUP BY people_id, city) x 
    GROUP BY people_id) AS t1 
JOIN (
    SELECT people_id, city, COUNT(*) AS visits 
    FROM cities 
    GROUP BY people_id, city) AS t2 
ON t1.people_id = t2.people_id AND t1.max_visits = t2.visits 

一般結構是基於SQL Select only rows with Max Value on a Column一個答案,而是獲得在表中的列的最大值,它的使用計數每個城市訪問子查詢中的最大值。不幸的是,它會導致一個醜陋的查詢,因爲你不得不重複那個子查詢,因爲MySQL沒有CTE。

然後,您可以加入people以獲取該人員的姓名並用圖像過濾出該人員的姓名。

SELECT p.name, t2.city, t2.visits 
FROM (
    SELECT people_id, MAX(visits) AS max_visits 
    FROM (
     SELECT people_id, city, COUNT(*) AS visits 
     GROUP BY people_id, city) x 
    GROUP BY people_id) AS t1 
JOIN (
    SELECT people_id, city, COUNT(*) AS visits 
    GROUP BY people_id, city) AS t2 
ON t1.people_id = t2.people_id AND t1.max_visits = t2.max_visits 
JOIN people AS p ON p.id = t1.people_id 
WHERE p.image IS NULL 

DEMO

+0

謝謝@Barmar,我採用了不同的解決方案,但這看起來同樣有效。 – huey