2013-06-30 9 views
1

У меня возникают проблемы с записью запросов, которые включают в себя совокупные функции (например, Count, а также при использовании With). У меня есть две таблицы People (id и name) и Books (bookid, author_id, title) (здесь author_id является внешним ключом для идентификатора People). У меня в настоящее время есть запрос, который возвращает мне всех людей, которые написали книгу (не все люди написали книгу).sql с использованием count with group by

SELECT People.name, 
     Books.title 
FROM People, 
    Books 
WHERE Books.author_id = People.id; 

Сейчас я пытаюсь найти только тех людей, которые написали более 2 книг и имеют вставили ту же информацию (people.name и books.title), но я запутался, как я бы идти о это. Я пытался использовать счетчик HAVING (People.name)> 1, но выбор, который я получаю, определенно неверен.

Относительно новых для использования sql, особенно когда речь заходит о внесении этих дополнительных параметров в мои запросы, и было просто интересно, сможет ли кто-нибудь помочь мне. Я не видел примеров запросов с этими условиями.

ответ

3

Лучше присоединиться к вашей таблице так:

SELECT People.name, Books.title 
FROM People INNER JOIN Books ON Books.author_id = People.id; 

и вы можете добавить свои предложения HAVING, как это:

SELECT Books.author_id 
FROM Books 
GROUP BY Books.author_id 
HAVING COUNT(*)>=2 

затем, чтобы выбрать всю информацию вам нужно, вы можете использовать этот :

SELECT People.name, Books.title 
FROM People INNER JOIN Books ON Books.author_id = People.id 
WHERE People.ID IN (
    SELECT Books.author_id 
    FROM Books 
    GROUP BY Books.author_id 
    HAVING COUNT(*)>=2 
) 
2
SELECT People.name, 
     Books.title 
FROM People, 
    Books 
WHERE Books.author_id = People.id 
    and exists (select 1 
       from (
       SELECT People.name name 
       FROM People, 
         Books 
       WHERE Books.author_id = People.id 
       group by Pepole.name 
       having count(People.name)>1 
      ) temp 
       where temp.name = People.name)