2012-02-23 2 views
0

해당 작성자가 작성한 책의 수를 알려주는 SQL 문을 만들고 싶습니다. SQLite에서 특정 외래 키의 개수 선택

당신이 authorid (books 테이블에 대한 외래 키)를 알고

그것은 쉽게 :

select count(*) from books where authorid = 25; 
15 

당신은 15 권의 책을 썼다 ID (15)와 그 저자를 볼 수 있습니다. 출력 내용이 다음과 같이 모든 작성자에 대한 설명을 만들 수 있습니까?

author_id, author_name, number_of_books 
1   Michael  15 
2   Robin  7 
... 

답변

2

당신은 group by 절을 사용하여이 작업을 수행 할 수있는 다음 books.author_id가 있는지 확인하십시오, 또한

select author_id, author_name, count(*) as number_of_books 
    from books 
    join author on books.author_id = author.id 
    group by author_id, author_name; 
+0

다른 답변에서 '내부 결합'을 묻는 이유는 여기에 붙여 넣으므로 여기에 붙여 넣습니다. '오늘날 대부분의 SQL 데이터베이스에서 JOIN은 INNER JOIN의 동의어입니다. 나는 상세하지만 모호하지 않은 전체 이름을 선호합니다. " – xralf

+0

작은 질문 하나만해도됩니까? number_of_books에서 '주문 하시겠습니까?' 이 에러로'group by'을 시도해 보았습니다 :'GROUP BY 절에는 집계 함수가 허용되지 않습니다'와'error by near "group": syntax error'라는 오류가있는'order by '로 시도했습니다. 가능하다면 아주 좋을 것입니다. – xralf

+0

@xralf 'order by'를 포함하도록 답변을 업데이트했습니다. –

2

이 쿼리 BY 그룹이 될 것입니다 열이 NULL이 아니면 성능이 저하됩니다.

+0

작동합니다. 왜 'as number_of_books'이 없으면 그 진술을 사용 했는가? – xralf

+0

'number_of_books'는 해당 이름을 출력 열에 제공합니다. – stuartd

+0

나는 그것을 생각했다. 그러나 표제는 보이지 않았다. 어쩌면 다른 DBMS에있을 수도 있습니다. – xralf

1
SELECT 
    books.author_id, authors.author_name, COUNT(books.author_id) AS number_of_books 
FROM 
    authors INNER JOIN books ON books.author_id = authors.id 
GROUP BY 
    author_name; 

:

select 
    a.author_id, 
    a.author_name, 
    count(*) as number_of_books 
from 
    authors a inner join 
    books b on b.author_id = a.author_id 
group by 
    a.author_id, 
    a.author_name 
order by 
    number_of_books 
+0

이것은 다른 답변보다 정확하지만 왜'count' 대신'join'과'sum' 대신'inner join'을 사용했는지 보입니다. 여기에 의미가 있습니까? @ 스튜어트는 그것을 사용하지 않았고 그것도 작동합니다. – xralf

+1

오늘날 대부분의 SQL 데이터베이스에서'JOIN'은'INNER JOIN'의 동의어입니다. 나는 장황하지만 확실한 성을 선호한다. SUM의 경우이 경우 count (*)가 동일한 결과를 산출하더라도 합계가 필요합니다. 다시 말하지만, 이것은 명확성의 이름입니다. 지금부터 코드를 유지할 때 또는 다른 누군가가이 코드를 명확하게 이해할 것입니다! – dotancohen

+0

SUM (books.author_id)이 모든 저자 ID를 * 합산하지 않습니까? – stuartd

관련 문제