MySQL三表联接

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

我有一些表使用联接表具有“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_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
)