选择一个或多个其他表中存在一个表的ID的记录

时间:2012-09-30 21:26:42

标签: mysql select join inner-join

好的,所以我发现了一些问题,这些问题只涉及两个表,如果其他表中不存在ID,那么解释如何执行此操作的大量问题,但不是此查询的解决方案。< / p>

基本上,我有一张葡萄酒年份表。

然后我有四个其他表格,其中包含与特定年份相关的不同类型的内容(即视频,博客等)

我基本上需要能够提取正在使用的年份列表,即在四个内容表中的一个或多个中使用年份ID的情况。

我能得到的最接近的是:

SELECT DISTINCT vintage_id FROM `pr_video_vintage`
INNER JOIN pr_video ON pr_video.fk_vintage_id = pr_video_vintage.vintage_id
INNER JOIN pr_reports ON pr_reports.fk_vintage_id = pr_video_vintage.vintage_id
INNER JOIN pr_reports_notes ON pr_reports_notes.fk_vintage_id = pr_video_vintage.vintage_id
INNER JOIN pr_blog_entries ON pr_blog_entries.fk_vintage_id = pr_video_vintage.vintage_id
ORDER BY `pr_video_vintage`.`vintage_id` ASC

但是这(我猜可以理解)只返回所有表中存在的ID。

我需要的是某种形式的“OR”JOIN,但无法找到有关如何执行此操作的任何信息。

提示? :)

3 个答案:

答案 0 :(得分:3)

试试这个:

SELECT  distinct vintage_id FROM `pr_video_vintage`
where exists(select 1 from pr_video where pr_video.fk_vintage_id = pr_video_vintage.vintage_id)
   or exists(select 1 from pr_reports where pr_reports.fk_vintage_id = pr_video_vintage.vintage_id)
   or exists(select 1 from pr_reports_notes where pr_reports_notes.fk_vintage_id = pr_video_vintage.vintage_id)
   or exists(select 1 from pr_blog_entries where pr_blog_entries.fk_vintage_id = pr_video_vintage.vintage_id)

    SELECT  distinct vintage_id FROM `pr_video_vintage`
where pr_video_vintage.vintage_id in (select pr_video.fk_vintage_id from pr_video)
   or pr_video_vintage.vintage_id in (select pr_reports.fk_vintage_id from pr_reports)
   or pr_video_vintage.vintage_id in (select pr_reports_notes.fk_vintage_id from pr_reports_notes)
   or pr_video_vintage.vintage_id in (select pr_blog_entries.fk_vintage_id from pr_blog_entries)

SELECT  distinct vintage_id FROM `pr_video_vintage`
where pr_video_vintage.vintage_id in (
   select pr_video.fk_vintage_id from pr_video
   union
   select pr_reports.fk_vintage_id from pr_reports
   union
   select pr_reports_notes.fk_vintage_id from pr_reports_notes
   union
   select pr_blog_entries.fk_vintage_id from pr_blog_entries)

答案 1 :(得分:1)

您可以尝试使用OUTER JOIN或LEFT / RIGHT JOIN。 OUTER JOIN计算所有条目的笛卡尔积,包括两个表中不存在的条目。 LEFT JOIN显示ON语句左侧表格中的所有内容,无论它是否存在于右侧,而RIGHT JOIN则相反。

此外,如果您想节省一些按键,INNER JOIN与JOIN相同!

答案 2 :(得分:0)

您可以运行LEFT JOIN s,它将为不存在的链接返回NULL Id,并结合一个子句来排除那些所有链接为NULL的行。

SELECT DISTINCT vintage_id FROM `pr_video_vintage`
LEFT JOIN pr_video
    ON pr_video.fk_vintage_id = pr_video_vintage.vintage_id
LEFT JOIN pr_reports
    ON pr_reports.fk_vintage_id = pr_video_vintage.vintage_id
LEFT JOIN pr_reports_notes
    ON pr_reports_notes.fk_vintage_id = pr_video_vintage.vintage_id
LEFT JOIN pr_blog_entries
    ON pr_blog_entries.fk_vintage_id = pr_video_vintage.vintage_id
WHERE
    pr_video.fk_vintage_id IS NOT NULL
    OR
    pr_reports.fk_vintage_id IS NOT NULL
    OR
    pr_reports_notes.fk_vintage_id IS NOT NULL
    OR
    pr_blog_entries.fk_vintage_id IS NOT NULL
ORDER BY `pr_video_vintage`.`vintage_id` ASC