好的,所以我发现了一些问题,这些问题只涉及两个表,如果其他表中不存在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,但无法找到有关如何执行此操作的任何信息。
提示? :)
答案 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