MySQL 在多个表上加入和 COUNT()
MySQL join and COUNT() on multiple tables
我正在尝试 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
SQL:
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
我从上述查询中得到的结果:
name | table2_count | table3_count | table4_count | table4_size
---------------------------------------------------------------
test | 4 | 2 | 2 | 1224
我应该得到的结果:
name | table2_count | table3_count | table4_count | table4_size
---------------------------------------------------------------
test | 3 | 1 | 2 | 1224
您将需要使用 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
这是一个fiddle.
解释: DISTINCT
关键字消除了所有重复值,生成了一个唯一值列表。
如果您 运行 您的查询没有 COUNT()
和 SUM()
,您将得到:
name table1_id table2_id table3_id size
test 1 1 1 1024
test 1 1 1 200
test 1 (null) (null) (null)
test 1 (null) (null) (null)
因此,如果您添加 COUNT()
和 SUM()
,您显然会得到:
name table1_id table2_id table3_id size
test 4 2 2 1224
但是,在您的查询中使用 DISTINCT
将无济于事,因为您可以清楚地看到重复值,这将导致:
name table1_id table2_id table3_id size
test 1 1 1 1224
现在,如果您 运行 我的查询没有 COUNT()
和 SUM()
,您将得到:
name table1_id table2_id table3_id size
test 1 1 1 1024
test 1 1 2 200
test 2 (null) (null) (null)
test 3 (null) (null) (null)
如果添加 COUNT()
和 SUM()
,您将获得与查询完全相同的结果:
name table1_id table2_id table3_id size
test 4 2 2 1224
但是,因为这次您有不同的值(即并非所有值都是 1),所以现在如果您使用 DISTINCT
计算唯一值,您将得到:
name table1_id table2_id table3_id size
test 3 1 2 1224
你可以这样试试吗
SELECT table1.name,
(SELECT COUNT(table2.table1_id) WHERE table1.id = table2.table1_id ) AS table2_count,
(SELECT COUNT(table3.table2_id) WHERE table2.id = table3.table1_id ) AS table3_count,
(SELECT COUNT(table4.table3_id) WHERE table3.id = table4.table1_id ) AS table4_count,
(SELECT SUM(table4.size) WHERE table3.id = table4.table1_id ) AS table4_size
FROM
table1
WHERE
table1.id = 1
我正在尝试 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
SQL:
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
我从上述查询中得到的结果:
name | table2_count | table3_count | table4_count | table4_size
---------------------------------------------------------------
test | 4 | 2 | 2 | 1224
我应该得到的结果:
name | table2_count | table3_count | table4_count | table4_size
---------------------------------------------------------------
test | 3 | 1 | 2 | 1224
您将需要使用 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
这是一个fiddle.
解释: DISTINCT
关键字消除了所有重复值,生成了一个唯一值列表。
如果您 运行 您的查询没有 COUNT()
和 SUM()
,您将得到:
name table1_id table2_id table3_id size test 1 1 1 1024 test 1 1 1 200 test 1 (null) (null) (null) test 1 (null) (null) (null)
因此,如果您添加 COUNT()
和 SUM()
,您显然会得到:
name table1_id table2_id table3_id size test 4 2 2 1224
但是,在您的查询中使用 DISTINCT
将无济于事,因为您可以清楚地看到重复值,这将导致:
name table1_id table2_id table3_id size test 1 1 1 1224
现在,如果您 运行 我的查询没有 COUNT()
和 SUM()
,您将得到:
name table1_id table2_id table3_id size test 1 1 1 1024 test 1 1 2 200 test 2 (null) (null) (null) test 3 (null) (null) (null)
如果添加 COUNT()
和 SUM()
,您将获得与查询完全相同的结果:
name table1_id table2_id table3_id size test 4 2 2 1224
但是,因为这次您有不同的值(即并非所有值都是 1),所以现在如果您使用 DISTINCT
计算唯一值,您将得到:
name table1_id table2_id table3_id size test 3 1 2 1224
你可以这样试试吗
SELECT table1.name,
(SELECT COUNT(table2.table1_id) WHERE table1.id = table2.table1_id ) AS table2_count,
(SELECT COUNT(table3.table2_id) WHERE table2.id = table3.table1_id ) AS table3_count,
(SELECT COUNT(table4.table3_id) WHERE table3.id = table4.table1_id ) AS table4_count,
(SELECT SUM(table4.size) WHERE table3.id = table4.table1_id ) AS table4_size
FROM
table1
WHERE
table1.id = 1