2017-07-20 84 views
0

我有这些表:盘点记录加入

用户

id_user | name 
1 | First 
2 | Second 

id_book | id_user | pages 
1 | 1 | 10 
2 | 1 | 5 
3 | 1 | 30 
4 | 2 | 15 
5 | 2 | 20 

电子书

id_ebook | id_user | pages 
1 | 1 | 20 
2 | 1 | 20 
3 | 2 | 10 
4 | 2 | 20 
5 | 2 | 10 

我想创建一个单个表格告诉我每个用户有多少书h电子书的总数,页数,电子书总数以及页面总数。

报告

id_user | total_books | sum_pag_books | total_ebooks | sum_pag_ebooks 
1 | 3 | 45 | 2 | 40 
2 | 2 | 35 | 3 | 40 

我有这样的代码:

SELECT 
user.name, 
COUNT(book.id_book) AS 'total_books', 
SUM(book.pages) AS 'sum_pag_books', 
COUNT(ebook.id_ebook) AS 'total_ebooks', 
SUM(ebook.pages) AS 'sum_pag_ebooks' 
FROM user 
LEFT JOIN book ON book.id_user = user.id_user 
LEFT JOIN ebook ON ebook.id_user = user.id_user 
GROUP BY user.id_user 

但是,结果是这样的,是不正确的,我该如何解决这个查询? 报告

id_user | total_books | sum_pag_books | total_ebooks | sum_pag_ebooks 
1 | 6 | 90 | 6 | 120 
2 | 6 | 105 | 6 | 80 

回答

1

你可以尝试分别聚集两个书表,然后加入到:

SELECT 
    user.name, 
    COALESCE(book.total_books, 0)  AS total_books, 
    COALESCE(book.sum_pag_books, 0) AS sum_pag_books, 
    COALESCE(ebook.total_ebooks, 0) AS total_ebooks, 
    COALESCE(ebook.sum_pag_ebooks, 0) AS sum_pag_ebooks 
FROM user 
LEFT JOIN 
(
    SELECT id_user, COUNT(*) AS total_books, SUM(pages) AS sum_pag_books 
    FROM book 
    GROUP BY id_user 
) book 
    ON book.id_user = user.id_user 
LEFT JOIN 
(
    SELECT id_user, COUNT(*) AS total_ebooks, SUM(pages) AS sum_page_ebooks 
    FROM ebook 
    GROUP BY id_user 
) ebook 
    ON ebook.id_user = user.id_user 

与您当前查询的问题是,你最终可能会计算同一页面更如果给定的用户拥有多本书,那么这一次就是一次。按照上面的方法分开汇总是避免这种重复计算问题的一种方法。