2017-09-05 149 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 
)