2012-09-30 121 views
2

好的,所以我發現了只有兩個表格才能解決的問題,這些問題解釋瞭如何在ID不存在於其他表中,但不是此查詢的解決方案。選擇一個表中某個表的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。

我需要的是某種形式的'或'加入,但找不到任何有關如何去做這件事的信息。

提示? :)

回答

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) 
+0

排名靠前的一個似乎有效 - 第二條語句也適用,如果最後三條語句的()中的表引用得到糾正。謝謝! – freestate

+0

更正了,謝謝。 –

+0

作爲參考,(在這種情況下,至少)第二個選項似乎比第一個更快,這反過來比第三個更快... – freestate

1

您可以嘗試使用OUTER JOIN或LEFT/RIGHT JOIN。 OUTER JOIN計算所有條目的笛卡爾乘積,包括兩個表中都不存在的條目。 LEFT JOIN顯示ON語句左側的表中的所有內容,而不管它是否存在於右側,RIGHT JOIN則是相反的。

此外,INNER JOIN和JOIN是一樣的,如果你想節省一些擊鍵的話!

+0

感謝您對INNER JOIN的建議 - 我努力嘗試RIGHT,但它似乎沒有做我所需要的。公噸。上面的Schneiders代碼做了我所需要的... – freestate

0

您可以運行LEFT JOIN s,這將返回NULL ID爲不存在的鏈接,該條款合併排除那些有的行全部鏈接無效。

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 
+0

我在第11行嘗試這個(第一個NOT NULL)時出現語法錯誤。 .. – freestate

+0

對不起,修正了它。 – LSerni

相關問題