Mysql 计算三重联接中每个表的记录数

Mysql 计算三重联接中每个表的记录数,mysql,Mysql,我有这些桌子: 使用者 书 电子书 我想创建一个表,告诉每个用户他有多少本书,总页数,他有多少本电子书,总页数 报告 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)

我有这些桌子:

使用者

电子书

我想创建一个表,告诉每个用户他有多少本书,总页数,他有多少本电子书,总页数

报告

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
但是,结果是这样的,并且是不正确的,如何解决查询? 报告


您可以尝试分别聚合这两个book表,然后加入其中:

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
当前查询的问题是,如果给定用户有多本书,那么可能会多次计算同一页。像我上面所做的那样进行单独的聚合是避免这种重复计算问题的一种方法

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
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