多个表上的 MySQL 连接和 COUNT()

Vic*_*tor 5 mysql sql sum count left-join

我试图COUNT()在一个查询中处理多个表,但我无法让它工作。这是我到目前为止所拥有的:

表格:

table1
---------------------
id | name
---------------------
 1 | test
 2 | test2


table2
---------------------
id | table1_id
---------------------
 1 | 1
 2 | 1
 3 | 1


table3
---------------------
id | table2_id
---------------------
 1 | 1


table4
---------------------
id | size | table3_id
---------------------
 1 | 1024 | 1
 1 | 200  | 1
Run Code Online (Sandbox Code Playgroud)

查询语句:

SELECT
    table1.name,
    COUNT(table2.table1_id) AS table2_count,
    COUNT(table3.table2_id) AS table3_count,
    COUNT(table4.table3_id) AS table4_count,
    SUM(table4.size) AS table4_size
FROM
    table1
LEFT JOIN table2
    ON table1.id = table2.table1_id
LEFT JOIN table3
    ON table2.id = table3.table2_id
LEFT JOIN table4
    ON table3.id = table4.table3_id
WHERE
    table1.id = 1
Run Code Online (Sandbox Code Playgroud)

我从上述查询中得到的结果:

name | table2_count | table3_count | table4_count | table4_size
---------------------------------------------------------------
test |      4       |      2       |      2       |    1224
Run Code Online (Sandbox Code Playgroud)

我应该得到的结果:

name | table2_count | table3_count | table4_count | table4_size
---------------------------------------------------------------
test |      3       |      1       |      2       |    1224
Run Code Online (Sandbox Code Playgroud)

Rac*_*lan 5

您将需要使用DISTINCT,但您还需要计算 ID,而不是外键:

SELECT
    table1.name,
    COUNT(DISTINCT table2.id) AS table2_count,
    COUNT(DISTINCT table3.id) AS table3_count,
    COUNT(DISTINCT table4.id) AS table4_count,
    SUM(table4.size) AS table4_size
FROM table1
LEFT JOIN table2 ON table1.id = table2.table1_id
LEFT JOIN table3 ON table2.id = table3.table2_id
LEFT JOIN table4 ON table3.id = table4.table3_id
WHERE table1.id = 1
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴

说明:DISTINCT关键字消除导致唯一值的列表中的所有重复值。

如果您在没有COUNT()and 的情况下运行查询SUM(),则会得到:

名称 table1_id table2_id table3_id 大小
测试 1 1 1 1024 
测试 1 1 1 200 
测试 1(空)(空)(空) 
测试 1(空)(空)(空) 

因此,如果添加COUNT()and SUM(),您显然会得到:

名称 table1_id table2_id table3_id 大小
测试 4 2 2 1224 

但是,DISTINCT与您的查询一起使用将无济于事,因为您可以清楚地看到重复的值,这将导致:

名称 table1_id table2_id table3_id 大小
测试 1 1 1 1224 

现在,如果你在没有COUNT()and 的情况下运行我的查询SUM(),你会得到:

名称 table1_id table2_id table3_id 大小
测试 1 1 1 1024 
测试 1 1 2 200 
测试 2(空)(空)(空) 
测试 3(空)(空)(空) 

如果添加COUNT()and SUM(),您将获得与查询完全相同的结果:

名称 table1_id table2_id table3_id 大小
测试 4 2 2 1224 

但是,因为这次您有不同的值(即并非所有值都是 1),所以现在如果您使用 计算唯一值DISTINCT,您将得到:

名称 table1_id table2_id table3_id 大小
测试 3 1 2 1224