2017-04-13 86 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