这可以通过单个SQL查询来解决吗?

时间:2017-04-13 15:29:09

标签: mysql sql dml

是否可以制作单个SQL查询来解决此问题?有4个表:

  • 书(id,title,something)
  • page(id,book_id,something)
  • syntax_error(id,page_id,fixed,something)(fixed - bool)
  • lexical_error(id,page_id,fixed,something)

book表与page表具有一对多的关系。

单个page可能包含syntax_errorlexical_error(对于此示例,一个页面不可能同时出错,每页只有一个错误)所以{{1与pagesyntax_error具有一对一的关系。

如何找到没有错误的所有图书? (如何获取没有任何错误或任何非固定错误的页面的所有lexical_error值?)

使用一个SQL查询。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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  
    )

答案 2 :(得分: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