提问者:小点点

MySQL:在这种情况下如何选择特定的行?


SELECT name 
FROM books 
WHERE book_id IN (
    SELECT book_id 
    FROM details 
    WHERE lang IN ('English') 
    GROUP BY book_id 
    HAVING COUNT(book_id)=1
); 

我的详细信息表如下:

book_id        lang
1            English
1            Spanish
1            French
2            English
3            Spanish
3            French
4            German
4            English

我如何选择哪些书只使用English编写,比如book_id=2?

当我编写代码时,我收到which book_id的包含'English‘lang,但是我想要得到的书只有一种语言,而且这种语言是'English’。


共2个答案

匿名用户

您可以使用不存在:

select b.*
from books b
where not exists (select 1
                  from details d
                  where d.book_id = b.book_id and
                        d.lang <> 'English'
                 );

那就是:除了英语,没有别的语言。

注:如果一本书没有细节,那么它也会被退回。 如果您想避免这种情况,可以使用聚合:

select b.*
from books b join
     details d
     using (book_id)
group by b.book_id
having min(lang) = 'English' and max(lang) = 'English';

匿名用户

假设lang/code>从不null,使用having子句设置条件:

SELECT name 
FROM books
WHERE book_id IN (
  SELECT book_id
  FROM details
  GROUP BY book_id
  HAVING SUM(lang <> 'English') = 0
)