Using multiple COUNTs and SUMs in a single SQL statement

后端 未结 2 965
清酒与你
清酒与你 2021-01-20 07:04

I have a tables called pages, page_views, page_items and page_votes. The latter three tables contain a

2条回答
  •  终归单人心
    2021-01-20 07:49

    This will select TOP 10 viewed pages, and will count items and votes only for these pages.

    Efficient if you have lots of pages but need only 10 of them, eliminates unneeded counting.

    SELECT  (
            SELECT COUNT(*)
            FROM   page_views
            WHERE  page_views.page_id = pages.id
            ) AS views_count,
            (
            SELECT COUNT(*)
            FROM   page_items
            WHERE  page_items.page_id = pages.id
            ) AS items_count,
            COALESCE(
            (
            SELECT SUM(vote)
            FROM   page_votes
            WHERE  page_votes.page_id = pages.id
            ), 0) AS votes_sum
    FROM    pages
    ORDER BY
            views_count DESC
    LIMIT 10
    

    Even more efficient query:

    SELECT  pages.*,
            (
            SELECT COUNT(*)
            FROM   page_items
            WHERE  page_items.page_id = pages.id
            ) AS items_count,
            COALESCE(
            (
            SELECT SUM(vote)
            FROM   page_votes
            WHERE  page_votes.page_id = pages.id
            ), 0) AS votes_sum
    FROM    (
            SELECT  page_id, COUNT(*) AS cnt
            FROM    page_views
            GROUP BY
                    page_id
            ORDER BY cnt DESC
            LIMIT 10
            ) AS pvd,
            pages
    WHERE  pages.id = pvd.page_id
    

    , eliminates unneeded joins with pages.

提交回复
热议问题