【问题标题】:Select records where ID from one table is present in one or more other tables选择一个表中的 ID 存在于一个或多个其他表中的记录
【发布时间】:2012-09-30 21:26:41
【问题描述】:

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

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

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

我基本上需要能够提取正在使用的年份列表,即在四个内容表中的一个或多个中使用年份 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。

我需要某种形式的“或”连接,但找不到任何有关如何执行此操作的信息。

提示? :)

【问题讨论】:

    标签: mysql select join inner-join


    【解决方案1】:

    试试这个:

    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)
    

    【讨论】:

    • 第一个似乎可以解决问题 - 如果最后三个语句的 () 中的表引用已更正,则第二个语句也有效。谢谢!
    • 作为参考,(至少在这种情况下)第二个选项似乎比第一个选项快一点,而后者又比第三个选项快...
    【解决方案2】:

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

    另外,如果您想节省一些击键,INNER JOIN 与 JOIN 是一回事!

    【讨论】:

    • 感谢关于 INNER JOIN 的提示 - 我在努力的过程中确实尝试了 RIGHT join,但它似乎并没有达到我需要的效果。上面的 Mt. Schneiders 代码可以满足我的需要......
    【解决方案3】:

    您可以运行LEFT JOINs,它将为不存在的链接返回一个 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-03
      • 2015-08-27
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多