2017-09-05 141 views
1

的所有城市查找國家我有四個表:用戶,國家,地區和城市用戶城市關係,其中用戶在關係到一個國家

國家擁有其中有許多城市許多地區。

用戶可以與0對多城市(希望訪問)相關。

我如何寫一個MySQL查詢(或DQL)是找出區域和國家的用戶是完全相關給他們,即希望訪問ALL他們的城市?

回答

1

對於地區,這將是容易比較的城市數量對

SELECT user_id, 
Region_count.region_id 
FROM User 
JOIN 
(SELECT user_id, region_id, count(*) as reg_user_count 
FROM City 
WHERE user_id='ThisUser' 
GROUP BY region_id) Region_Count 
    ON Region_Count.user_id=User.user_id 
JOIN 
(SELECT region_id, count(*) as reg_max 
FROM City 
GROUP BY region_id) as Region_Max 
ON Region_Max.region_id=Region_Count.region_id 
    AND Region_Max.reg_max=Region_Count.reg_user_count 
WHERE user_id='ThisUser' 

你可以做針對國內同城市的最大數量。讓我知道你是否無法弄清楚。

0

User開始。然後加入更大的實體,並使用不同的來減少重複。

SELECT distinct 
    u.user_name 
    ,r.region_name 
    ,co.country_name 
FROM users u 
LEFT JOIN cities c ON u.wish_to_visit = c.city_name 
LEFT JOIN regions r ON c.region = r.region_name 
LEFT JOIN countries co ON r.country = co.country_name 
WHERE u.user_name = 'John Doe' 

編輯:找到用戶想要訪問所有

發帖提問更新僅國家,讓用戶想在其中訪問所有城市的唯一的國家拉。在這種情況下,我們從國家開始,一直到用戶。然後我們總結一個國家的城市佔有多少百分比。

關鍵是隻加入我們關心的用戶(不要通過他們過濾,這將消除NULL,其中用戶不匹配城市)。畢竟,一個簡單的HAVING將幫助我們過濾只有完整匹配的國家。

SELECT 
    c.country_name 
    ,count(ci.city_name) as count_all_cities 
    ,count(u.wish_to_visit) as count_user_cities 
FROM countries c 
LEFT JOIN regions r ON c.country_name = r.country 
LEFT JOIN cities ci ON r.region_name = ci.region 
LEFT JOIN users u ON ci.city_name = u.wish_to_visit AND u.user_name = 'John Doe' 
GROUP BY c.country_name 
HAVING count(ci.city_name) = count(u.wish_to_visit) 
+0

你知道,我需要一個用戶希望訪問的國家**所有**他們的城市,而不是**他們的城市之一? – MedUnes

+0

@MedUnes我沒有。已更新以反映更改。 – ScottieB

0

使用加入

select cu.country_name, r.region_name from User u join City c 
on u.cityID=c.cityID join Region r on 
c.regionID=r.regionID join Country cu 
on r.countryID=cu.countryID 
where u.userID=SOMEID 
+0

這將包括願望清單 – MedUnes

+0

甚至有**一個**城市的國家,因此您可以使用過濾器,如where子句'where u.userID = SOMEID' – Geek

+0

這與用戶無關。 – MedUnes

0

使用NOT EXISTSLEFT JOIN

SELECT * 
FROM Region r 
WHERE NOT EXISTS(
    SELECT 1 
    FROM City c 
    LEFT JOIN User u ON c.id_city = u.id_city and u.id_user = 'user_id' 
    WHERE c.id_reg = r.id_reg and u.id_user IS NULL 
) 

這將找到只有在用戶希望訪問所有城市地區,但是,如果你想國家,它只是一個輕微的修改

SELECT * 
FROM Country ctr 
WHERE NOT EXISTS(
    SELECT 1 
    FROM Region r 
    LEFT JOIN City c ON r.id_reg = c.id_reg 
    LEFT JOIN User u ON c.id_city = u.id_city and u.id_user = 'user_id' 
    WHERE ctr.id_country = r.id_country and u.id_user IS NULL 
)