MySQL三表联接
我有一些表使用联接表具有“has”和“属于许多”类型的关系。主要表格包括国家、计划和清单。基本结构是:MySQL三表联接,mysql,join,Mysql,Join,我有一些表使用联接表具有“has”和“属于许多”类型的关系。主要表格包括国家、计划和清单。基本结构是: countries -id -name programs -id -name listings -id -title countries_programs -country_id -program_id listings_programs -listing_id -program_id listings_countries -listing
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)时,我一直在执行以下操作以列出某个国家的计划:
我需要做的是,仅当特定国家的节目实际上也在该国境内时,才返回该国的节目。因此,它应该只返回指定国家/地区的节目,以及该节目和该国家/地区的节目列表
如果指定国家/地区的程序没有列表,则我不希望返回该程序。我一直在尝试各种组合,但似乎无法实现。有人知道如何做到这一点吗
我想我需要加入listings表,但我尝试过的都没有成功。为了避免返回重复数据,我会使用
EXISTS
子句。另外,切换到内部连接以满足国家/地区要求
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
)
我省略了对国家的连接
,因为您只处理在国家计划中可用的国家ID
使用内部连接,而不是外部连接。非常感谢Phil。我还没有得到我所需要的结果,但你给了我努力解决问题的基础。我真的很感激。我让它工作起来了,我只需要做一点小小的改变。从你的答案中可以看出:其中cp.id=5需要是cp.country\u id。我想这就是我所需要的使它工作的全部内容。再次感谢,我真的很感谢你的帮助。@Frank Oops,我的错。我会把答案写进去的
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
)