Mysql SQL从一个表中获取所有列以及由外键关联的另一个表中分组列的计数

Mysql SQL从一个表中获取所有列以及由外键关联的另一个表中分组列的计数,mysql,sql,join,group-by,Mysql,Sql,Join,Group By,我有两个表“项目日志”和“日志附件”。“logs\u attachments”表通过外键“project\u log\u id”与“projects\u logs”相关。每个项目id与多个“项目日志id”相关,每个“项目日志id”与多个“日志附件id”相关。我想获得一个项目的所有日志记录,以及每个日志附带的附件数量 项目日志 +----------------+------------+---------+---------------------------------------------

我有两个表“项目日志”和“日志附件”。“logs\u attachments”表通过外键“project\u log\u id”与“projects\u logs”相关。每个项目id与多个“项目日志id”相关,每个“项目日志id”与多个“日志附件id”相关。我想获得一个项目的所有日志记录,以及每个日志附带的附件数量

项目日志

+----------------+------------+---------+-----------------------------------------------+---------------------+---------------------+
| project_log_id | project_id |  event  |                     notes                     |     created_at      |     updated_at      |
+----------------+------------+---------+-----------------------------------------------+---------------------+---------------------+
|              5 |          3 | started | Aut et dolores voluptatem id culpa inventore. | 2018-10-05 07:10:46 | 2018-10-05 07:10:46 |
|              6 |          3 | on-hold | dolores voluptatem id culpa                   | 2018-10-05 07:10:46 | 2018-10-05 07:10:46 |
|            241 |          3 | resumed | Isdnu sdlw o dolores voluptatem id            | 2018-10-05 07:10:46 | 2018-10-05 07:10:46 |
+----------------+------------+---------+-----------------------------------------------+---------------------+---------------------+
日志和附件

+-------------------+----------------+---------------------------+-----------+-----------+------------+---------------------+---------------------+
| log_attachment_id | project_log_id |         file_name         | file_type | attachment | file_size |     created_at      |     updated_at      |
+-------------------+----------------+---------------------------+-----------+-----------+------------+---------------------+---------------------+
|                24 |              5 | hic                       | rtf       | 5_biY     |       1212 | 2018-10-05 07:10:47 | 2018-10-05 07:10:47 |
|                23 |              5 | omnis                     | xls       | 5_3QC     |       5594 | 2018-10-05 07:10:47 | 2018-10-05 07:10:47 |
|                26 |              6 | quo                       | xlsx      | 6_kfS     |       2765 | 2018-10-05 07:10:47 | 2018-10-05 07:10:47 |
|                27 |              6 | consequuntur              | txt       | 6_BGd     |         94 | 2018-10-05 07:10:47 | 2018-10-05 07:10:47 |
|              1201 |            241 | SampleJPGImage_50kbmb.jpg | jpeg      | 241_xYP   |      51085 | 2018-10-09 12:34:19 | 2018-10-09 12:34:19 |
+-------------------+----------------+---------------------------+-----------+-----------+------------+---------------------+---------------------+
我想要什么

+----------------+------------+---------+-----------------------------------------------+---------------------+---------------------+----------------------------------------+
| project_log_id | project_id | events  |                     notes                     |     created_at      |     updated_at      | count(logs_attachments.project_log_id) |
+----------------+------------+---------+-----------------------------------------------+---------------------+---------------------+----------------------------------------+
|              5 |          3 | started | Aut et dolores voluptatem id culpa inventore. | 2018-10-05 07:10:46 | 2018-10-05 07:10:46 |                                      2 |
|              6 |          3 | on-hold | dolores voluptatem id culpa                   | 2018-10-05 07:10:46 | 2018-10-05 07:10:46 |                                      2 |
|            241 |          3 | resumed | Isdnu sdlw o dolores voluptatem id            | 2018-10-05 07:10:46 | 2018-10-05 07:10:46 |                                      1 |
+----------------+------------+---------+-----------------------------------------------+---------------------+---------------------+----------------------------------------+
对子查询使用join和
count()

select t1.*,
COALESCE(t2.cnt, 0)  as count_logs_attachments.project_log_id
from 
projects_logs as t1
left join 
(
select project_log_id,count(*) as cnt from  logs_attachments
group by project_log_id
) t2 on 
t1.project_log_id=t2.project_log_id
COALESCE
函数将帮助您在不存在日志附件的情况下获取0

使用join和
count()
子查询

select t1.*,
COALESCE(t2.cnt, 0)  as count_logs_attachments.project_log_id
from 
projects_logs as t1
left join 
(
select project_log_id,count(*) as cnt from  logs_attachments
group by project_log_id
) t2 on 
t1.project_log_id=t2.project_log_id

COALESCE
功能将帮助您在不存在日志和附件的情况下获取0

一个简单的连接应该可以在这里工作:

SELECT
    p.project_log_id,
    p.project_id,
    p.event,
    p.notes,
    p.created_at,
    p.updated_at
    COALESCE(a.count, 0) AS count
FROM projects_logs p
LEFT JOIN
(
    SELECT project_log_id, COUNT(*) AS count
    FROM logs_attachments a
    GROUP BY project_log_id
) a
    ON p.project_log_id = a.project_log_id;

在这里,简单的连接应该起作用:

SELECT
    p.project_log_id,
    p.project_id,
    p.event,
    p.notes,
    p.created_at,
    p.updated_at
    COALESCE(a.count, 0) AS count
FROM projects_logs p
LEFT JOIN
(
    SELECT project_log_id, COUNT(*) AS count
    FROM logs_attachments a
    GROUP BY project_log_id
) a
    ON p.project_log_id = a.project_log_id;

您可以像这样编写sql查询

select pl.project_log_id, pl.project_id, pl.event, pl.notes, pl.created_at, pl.updated_at, pla.attachment_count
from projects_logs as pl
inner join
    (select count(log_attachment_id) as attachment_count, project_log_id
     from  logs_attachments group by project_log_id) as pla
     on pla.project_log_id = pl.project_log_id

您可以像这样编写sql查询

select pl.project_log_id, pl.project_id, pl.event, pl.notes, pl.created_at, pl.updated_at, pla.attachment_count
from projects_logs as pl
inner join
    (select count(log_attachment_id) as attachment_count, project_log_id
     from  logs_attachments group by project_log_id) as pla
     on pla.project_log_id = pl.project_log_id


+我只是想知道为什么
project\u log\u id
是否是PK/唯一的真的很重要。我在这里遗漏了什么吗?@MadhurBhaiya,因为根据严格的ANSI规则,我们不能选择任何列,这些列要么不出现在
GROUP BY
中,要么在功能上不依赖于
GROUP BY
中的列。因此,如果对于给定的
项目\u log\u id
,可能有两条记录具有不同的值,比如
notes
,那么我编写的查询没有意义。现在,它可能仍然在MySQL上运行,但这是一种糟糕的做法。因此,如果我们在一个表中按主键分组,我们可能总是从该表中选择所有列。在MySQL、Postgres中也是如此,但我认为Oracle和SQL Server仍然不允许这样做。这给了我错误“p.project_id”不在Group By中。是的,你是对的,项目\日志\ id是主要的key@Tintin然后你必须使用一个子查询,用于一个稍微丑陋的整体查询。+1只是想知道为什么
project\u log\u id
是否是PK/唯一的真的很重要。我在这里遗漏了什么吗?@MadhurBhaiya,因为根据严格的ANSI规则,我们不能选择任何列,这些列要么不出现在
GROUP BY
中,要么在功能上不依赖于
GROUP BY
中的列。因此,如果对于给定的
项目\u log\u id
,可能有两条记录具有不同的值,比如
notes
,那么我编写的查询没有意义。现在,它可能仍然在MySQL上运行,但这是一种糟糕的做法。因此,如果我们在一个表中按主键分组,我们可能总是从该表中选择所有列。在MySQL、Postgres中也是如此,但我认为Oracle和SQL Server仍然不允许这样做。这给了我错误“p.project_id”不在Group By中。是的,你是对的,项目\日志\ id是主要的key@Tintin然后,您将不得不使用子查询,以获得稍微难看的总体查询。谢谢!子查询方法正在工作。不能投票给你的答案,没有必要的声誉。最后一行有一个拼写错误。应该是t1。project_log_id=t2。project_log_id对不起。但是接受的答案更好,选择正确的答案作为接受的答案将帮助寻找类似解决方案的任何人,因此我选择它作为接受的答案。接受的答案处理没有日志附件的情况。在这种情况下,它返回0而不是NULL。“COALESCE(a.count,0)”我可以看到您修改了答案以处理这种情况,但在我接受答案时,答案并不在那里。没什么私事。我只是想通过接受最好的答案来帮助社区。谢谢!子查询方法正在工作。不能投票给你的答案,没有必要的声誉。最后一行有一个拼写错误。应该是t1。project_log_id=t2。project_log_id对不起。但是接受的答案更好,选择正确的答案作为接受的答案将帮助寻找类似解决方案的任何人,因此我选择它作为接受的答案。接受的答案处理没有日志附件的情况。在这种情况下,它返回0而不是NULL。“COALESCE(a.count,0)”我可以看到您修改了答案以处理这种情况,但在我接受答案时,答案并不在那里。没什么私事。我只是想通过接受最好的答案来帮助社区。