복붙노트

[SQL] 어떻게 테이블의 각 외래 키 ID의 인스턴스의 수를 계산하려면?

SQL

어떻게 테이블의 각 외래 키 ID의 인스턴스의 수를 계산하려면?

여기 내 간단한 SQL 질문입니다 ...

나는 두 개의 테이블이 있습니다

서적

-------------------------------------------------------
| book_id | author | genre | price | publication_date |
-------------------------------------------------------

명령

------------------------------------
| order_id | customer_id | book_id |
------------------------------------

나는 쿼리가 반환을 만들고 싶습니다

--------------------------------------------------------------------------
| book_id | author | genre | price | publication_date | number_of_orders |
--------------------------------------------------------------------------

즉, 계산 된 열와 함께 책 테이블에 카운트 횟수 각 책은 주문 테이블에 나타나는 이름이 'number_of_orders을'모든 행에 대한 모든 열을 반환합니다. 책을 주문 테이블에서 발생하지 않는 경우 (즉, 책은 결과 집합에 표시되어야하지만 "number_of_orders는"0이되어야합니다.

지금까지, 나는이 함께 왔어요 :

SELECT
    books.book_id,
    books.author,
    books.genre,
    books.price,
    books.publication_date,
    count(*) as number_of_orders
from books
left join orders
on (books.book_id = orders.book_id)
group by
    books.book_id,
    books.author,
    books.genre,
    books.price,
    books.publication_date

책은 주문 표에 표시되지 않을 경우에도 "number_of_orders는"1 것이기 때문에 즉,하지만 꽤 거의 맞습니다. 또한, SQL에 대한 지식의 나의 부족을 주어,이 쿼리가 매우 비효율적이다 확신합니다.

이 쿼리를 작성하는 올바른 방법은 무엇입니까? (무엇의 가치를 들어, MySQL을 작업이 요구는, 그래서 다른 어떤 벤더 고유의 기능을 사용할 수 없습니다).

사전에 감사합니다!

해결법

  1. ==============================

    1.귀하의 질의는 거의 바로이며이를위한 올바른 방법 (그리고 가장 효율적인)입니다

    귀하의 질의는 거의 바로이며이를위한 올바른 방법 (그리고 가장 효율적인)입니다

    SELECT books.*, count(orders.book_id) as number_of_orders        
    from books
    left join orders
    on (books.book_id = orders.book_id)
    group by
        books.book_id
    

    그것은 주어진 필드에 NULL 값을 무시하기 때문에 COUNT (orders.book_id이)하지 않는하면서, 모든 행을 계산하기 때문에 COUNT (*)는 계산에 NULL 값을 포함 할 수있다.

  2. ==============================

    2.변경 수 (*) 카운트 (orders.book_id)

    변경 수 (*) 카운트 (orders.book_id)

  3. ==============================

    3.

    SELECT b.book_id,
        b.author,
        b.genre,
        b.price,
        b.publication_date,
        coalesce(oc.Count, 0) as number_of_orders
    from books b
    left join (
        select book_id, count(*) as Count 
        from Order 
        group by book_id
    ) oc on (b.book_id = oc.book_id)
    
  4. ==============================

    4.당신은 잘못된 일을 계산하고 있습니다. 당신은 null이 아닌 book_id의를 계산합니다.

    당신은 잘못된 일을 계산하고 있습니다. 당신은 null이 아닌 book_id의를 계산합니다.

    SELECT
        books.book_id,
        books.author,
        books.genre,
        books.price,
        books.publication_date,
        count(orders.book_id) as number_of_orders
    from books
    left join orders
    on (books.book_id = orders.book_id)
    group by
        books.book_id,
        books.author,
        books.genre,
        books.price,
        books.publication_date
    
  5. ==============================

    5.

    select author.aname,count(book.author_id) as "number_of_books"
    from author 
    left join book 
    on(author.author_id=book.author_id)
    GROUP BY author.aname;
    
  6. from https://stackoverflow.com/questions/7424913/how-to-count-the-number-of-instances-of-each-foreign-key-id-in-a-table by cc-by-sa and MIT license