MySQL连接三个表

时间:2011-10-23 23:11:41

标签: mysql join

我有一些表使用连接表'拥有并属于许多'类型关系。主要表格是国家,计划和列表。基本结构是:

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'

我需要做的只是只有当特定国家/地区的计划实际上还有该国家/地区的列表时,才会返回该国家/地区的计划。因此,它应仅返回程序位于指定国家/地区且具有该程序中以及该国家/地区的列表的情况。

如果指定国家/地区的某个程序没有列表,那么我不希望它返回。我一直在尝试各种组合,但似乎无法让这个工作。有没有人知道如何做到这一点?

我想我需要加入清单表,但我尝试过的任何事情都没有结束。

1 个答案:

答案 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