我有一些表使用连接表'拥有并属于许多'类型关系。主要表格是国家,计划和列表。基本结构是:
countries
-id
-name
programs
-id
-name
listings
-id
-title
countries_programs
-country_id
-program_id
listings_programs
-listing_id
-program_id
listings_countries
-listing_id
-country_id
在给定国家/地区ID值(在本例中为5)时,我一直在执行以下操作列出国家/地区的程序:
SELECT programs.*
FROM programs
LEFT JOIN countries_programs ON programs_id = countries_programs.program_id
LEFT JOIN countries ON countries.id = countries_programs.country_id
WHERE countries_id = '5'
我需要做的只是只有当特定国家/地区的计划实际上还有该国家/地区的列表时,才会返回该国家/地区的计划。因此,它应仅返回程序位于指定国家/地区且具有该程序中以及该国家/地区的列表的情况。
如果指定国家/地区的某个程序没有列表,那么我不希望它返回。我一直在尝试各种组合,但似乎无法让这个工作。有没有人知道如何做到这一点?
我想我需要加入清单表,但我尝试过的任何事情都没有结束。
答案 0 :(得分:1)
为避免返回重复数据,我使用EXISTS
子句。此外,切换到INNER
加入以满足国家/地区要求。
SELECT p.*
FROM programs p
INNER JOIN countries_programs cp
ON p.id = cp.program_id
WHERE cp.country_id = 5
AND EXISTS (
SELECT 1 FROM listings_countries lc
INNER JOIN listings_programs lp
ON lc.listing_id = lp.listing_id
WHERE lc.country_id = c.id
AND lp.program_id = p.id
)
由于您只处理countries
中提供的国家/地区ID,因此我已将联接省略为countries_programs
。