2017-04-13 88 views
1

是否可以通過單個SQL查詢來解決這個問題?有4個表:這可以通過單個SQL查詢來解決嗎?

  • 書(ID,標題,東西)
  • 頁(ID,book_id,東西)
  • syntax_error(ID,PAGE_ID,固定的東西)(固定 - 布爾)
  • lexical_error(ID,PAGE_ID,固定,東西)

book表具有與表page一對多的關係。

單個page可以含有syntax_errorlexical_error(在這個例子中,不可能有兩個錯誤對於一頁,和每個頁面只有一個錯誤),因此page具有syntax_errorlexical_error一對一的關係。

我怎樣才能找到沒有錯誤的書? (我怎樣才能得到所有book.id值沒有任何錯誤或任何非固定錯誤?)

通過使用一個SQL查詢。

回答

2

您可以使用NOT EXISTS

SELECT id, title, ... 
FROM book AS b 
WHERE NOT EXISTS (SELECT 1 
        FROM page AS p 
        JOIN syntax_error AS se ON p.id = se.page_id 
        WHERE p.book_id = b.id) 
     AND 
     NOT EXISTS (SELECT 1 
        FROM page AS p 
        JOIN lexical_error AS le ON p.id = le.page_id 
        WHERE p.book_id = b.id) 
+0

我可能會使用這個,如果它WASN '噸MySQL,只是因爲我讀了mysql與'not exists()'相比,其他選擇很難。儘管如此,+1仍是一個很好的答案。 [不存在與不存在與左連接/是NULL:MySQL](https://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is- null-mysql /) – SqlZim

+0

@SqlZim。 。 。我認爲'union all'排除了索引的使用,所以這可能比那個版本快得多。 –

1

使用not in()(刪除以前的聯合在一起not in(),因爲它可能無法利用索引)

select b.id 
from book b 
where b.id not in (
    select p.book_id 
    from page p 
     inner join syntax_error se 
     on p.id = se.page_id 
     and se.fixed = 0 
    ) 
    and b.id not in (
    select p.book_id 
    from page p 
     inner join lexical_error le 
     on p.id = le.page_id 
     and le.fixed = 0 
    ) 
0
select b.id 
from book b 
left outer join page p on p.book_id = b.id 
left outer join syntax_error s on s.page_id = p.id 
left outer join lexical_error l on l.page_id = p.id 
group by b.id 
having sum(case s.fixed when 0 then 1 else 0 end) = 0 
and sum(case l.fixed when 0 then 1 else 0 end) = 0