2

好的,所以我发现了仅使用两个表就可以做到这一点的问题,大量的问题解释了如果 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。

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

尖端?:)

4

3 回答 3

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)
于 2012-09-30T21:32:35.153 回答
1

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

此外,如果您想节省一些击键,INNER JOIN 与 JOIN 是一样的!

于 2012-09-30T21:32:15.780 回答
0

您可以运行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
于 2012-09-30T21:33:18.823 回答