的所有城市查找國家我有四個表:用戶,國家,地區和城市用戶城市關係,其中用戶在關係到一個國家
國家擁有其中有許多城市許多地區。
用戶可以與0對多城市(希望訪問)相關。
我如何寫一個MySQL查詢(或DQL)是找出區域和國家的用戶是完全相關給他們,即希望訪問ALL他們的城市?
的所有城市查找國家我有四個表:用戶,國家,地區和城市用戶城市關係,其中用戶在關係到一個國家
國家擁有其中有許多城市許多地區。
用戶可以與0對多城市(希望訪問)相關。
我如何寫一個MySQL查詢(或DQL)是找出區域和國家的用戶是完全相關給他們,即希望訪問ALL他們的城市?
對於地區,這將是容易比較的城市數量對
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'
你可以做針對國內同城市的最大數量。讓我知道你是否無法弄清楚。
從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)
使用加入
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
使用NOT EXISTS
和LEFT 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
)
你知道,我需要一個用戶希望訪問的國家**所有**他們的城市,而不是**他們的城市之一? – MedUnes
@MedUnes我沒有。已更新以反映更改。 – ScottieB