SQL Как выбрать строки на основе значений из нескольких строк

#sql #select #inner-join #aggregate-functions #having-clause

#sql #выберите #внутреннее соединение #агрегатные функции #having-предложение

Вопрос:

Привет, я столкнулся с проблемой, связанной со следующими таблицами

        CREATE TABLE BOOKS ( 
          Title varchar(255),
          Year INT,
          Type ENUM("Horror", "Fantasy"),
          Pages INT,
          PRIMARY KEY (Title, Year)
        );
        
        CREATE TABLE AUTHORS(
          Title varchar(255), 
          Year INT, 
          PlaceOfBirth varchar(255), 
          AuthorName varchar(255),
          PRIMARY KEY (Title, Year, PlaceOfBirth ),
          FOREIGN KEY (Title, Year) REFERENCES BOOKS(Title, Year)
        );
 

Теперь я хочу запросить всех авторов, у которых есть только книги ужасов объемом 40 страниц и более.

 SELECT a.AuthorName, b.Pages FROM AUTHORS a INNER JOIN BOOKS b ON a.Title=b.Title AND a.Year=b.Year
WHERE  b.Type="Horror" AND b.Pages > 40
 

Проблема в том, что теперь я получаю тех авторов, которые написали книги ужасов объемом более 40 страниц, но у них также могут быть книги ужасов объемом менее 40 страниц. Мне нужны те авторы, которые писали только книги ужасов объемом 40 страниц или больше.

Ответ №1:

Если вам нужно имя авторов, которые написали хотя бы одну книгу ужасов и чьи все такие книги имеют более 40 страниц, вы можете использовать group by и having :

 select a.authorname
from authors a 
inner join books b on a.title = b.title and a.year = b.year
where b.type = 'Horror' 
group by a.authorname
having min(b.pages) > 40
 

Комментарии:

1. Я рассматривал это, но mysql выдает ошибку, когда я пытаюсь это сделать Выражение # 2 списка ВЫБОРА не находится в предложении GROUP BY и содержит неагрегированный столбец