gpt4 book ai didi

MySQL 查询 - 将 3 个表连接在一起,按一列分组并计算其他 2 个

转载 作者:行者123 更新时间:2023-11-29 07:05:17 25 4
gpt4 key购买 nike

以下是我正在使用的 3 个表的示例。

    Teams    +----+------+    | id | name |    +----+------+    |  1 | abc  |    |  2 | def  |    |  3 | ghi  |    +----+------+
    Members    +----+-----------+----------+---------+    | id | firstname | lastname | team_id |    +----+-----------+----------+---------+    |  1 | joe       | smith    |       1 |    |  2 | jared     | robinson |       1 |    |  3 | sarah     | cole     |       3 |    |  4 | jaci      | meyers   |       2 |    +----+-----------+----------+---------+
    Goals    +----+-----------+    | id | member_id |    +----+-----------+    |  1 |         3 |    |  2 |         2 |    |  3 |         2 |    |  4 |         3 |    |  5 |         1 |    +----+-----------+    


And I'm trying to get a query that outputs something like this ...

    Output    +--------+----------------+-------------+    | t.name | Count(members) | Count(goals)|    +--------+----------------+-------------+    | abc    |              2 |           3 |    | def    |              1 |           2 |    | ghi    |              1 |           0 |    +--------+----------------+-------------+    


This is the closest I've come, but when I use the group by in the subquery I get "Subquery returns more than 1 row".

select t.name, count(*), 
(select count(*)
from teams t
inner join members m on m.team_id = t.id
group by t.id)
from teams t
inner join members m on m.team_id = t.id
inner join goals g on g.member_id = m.id
group by t.id

最佳答案

根据我的理解,这是我提出的查询:


SELECT name, membersCount, IFNULL(totalCount, 0) goalsCount FROM
(
SELECT m.team_id, SUM(innerQuery.goalsCount) totalCount
FROM (
SELECT m.id memberId, COUNT(*) goalsCount
FROM Members m
JOIN Goals g
ON m.id = g.member_id
GROUP BY member_id
) innerQuery
JOIN Members m
ON innerQuery.memberId = m.id
GROUP BY m.team_id
) inner_1
RIGHT JOIN
(
SELECT t.id, t.name, COUNT(*) membersCount
FROM Teams t
JOIN Members m
ON t.id = m.team_id
GROUP BY team_id
) inner_2
ON inner_1.team_id = inner_2.id

查询的分割:

#1。获取成员(member) ID 及其关联的目标计数 (innerQuery)


SELECT m.id memberId, COUNT(*) goalsCount
FROM Members m
JOIN Goals g
ON m.id = g.member_id
GROUP BY member_id

#2。获取目标总和的团队 ID (inner_1)


SELECT m.team_id, SUM(innerQuery.goalsCount) totalCount
FROM (
.... Sub-query in step 1
) innerQuery
JOIN Members m
ON innerQuery.memberId = m.id
GROUP BY m.team_id

#3。获取每个团队的成员总数 (inner_2)


SELECT t.id, t.name, COUNT(*) membersCount
FROM Teams t
JOIN Members m
ON t.id = m.team_id
GROUP BY team_id

#4。 RIGHT JOIN inner_1 和 inner_2(因为会有 NULL)并使用 IFNULL 检查并替换那个 0


SELECT name, membersCount, IFNULL(totalCount, 0) goalsCount FROM
(
.... Sub-query in step 2
) inner_1
RIGHT JOIN
(
.... Sub-query in step 3
) inner_2
ON inner_1.team_id = inner_2.id

关于MySQL 查询 - 将 3 个表连接在一起,按一列分组并计算其他 2 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7641928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com