【问题标题】:Join three tables with group by to get counts通过 group by 加入三个表以获取计数
【发布时间】:2016-07-26 01:31:08
【问题描述】:

我有三个表 - Ad(Id,AgentId,AdDesc,AdTitle,EmailId,ADate)、AdComment(ComId,email,comment,AdId) 和 MyLikes(LikeId,email,AdId)。在这里,我必须加入三个表并显示广告表的所有字段以及基于每个广告 ID(Ad.Id=AdComment.AdId)的 AdComment 表中的 cmets 数和基于每个广告 ID 的给定电子邮件的 MyLikes 的喜欢数(Ad.Id=MyLikes.AdId)。

当我刚加入广告和广告评论时,我使用了 -

SELECT * , (
SELECT COUNT( c.AdId )
) AS ComCount
FROM Ad a
LEFT JOIN AdComment c ON a.Id = c.AdId 
GROUP BY a.Id
ORDER BY a.Id DESC

这工作正常。

当我加入 Ad 和 MyLikes 时,我使用了 -

SELECT a.Id, (
SELECT COUNT( * )
FROM MyLikes m
WHERE (
m.email = 'nik@gmail.com'
AND m.AdId = a.Id
)
) AS MyCount
FROM Ad a
LEFT JOIN MyLikes m ON a.Id = m.AdId
GROUP BY a.Id

这工作正常。

但是当我尝试所有三个表连接时它都不起作用,给出了一些错误的评论计数值。 为此,我使用了-

SELECT a.Id,a.AgentId,a.EmailId,a.AdTitle,a.AdDesc, (
SELECT COUNT(m.AdId)
FROM MyLikes m
WHERE (
m.email = 'nik@gmail.com'
AND m.AdId = a.Id
)
) AS MyCount,(
SELECT COUNT( c.AdId )
) AS ComCount
FROM Ad a
LEFT JOIN MyLikes m ON a.Id = m.AdId LEFT JOIN AdComment c ON a.Id = c.AdId
GROUP BY a.Id ORDER BY a.Id DESC    

我怎样才能加入这三个表并得到想要的结果。

【问题讨论】:

  • 请编辑您的问题并提供示例数据和所需结果。

标签: mysql group-by left-join


【解决方案1】:

假设我正确理解了您的问题,这里有一个选项是使用子查询来 count 您在 joins 中的数据:

select a.Id, a.AgentId, a.EmailId, a.AdTitle, a.AdDesc, 
       b.AdIdCount, c.AdIdCount
from Ad a
       left join (select AdId, count(*) AdIdCount 
                  from AdComment 
                  group by AdId) b ON a.Id = b.AdId 
       left join (select AdId, count(*) AdIdCount 
                  from MyLikes 
                  where email = 'nik@gmail.com'
                  group by AdId) c ON a.Id = c.AdId 

如果您更喜欢correlated subqueries,那么这应该可以:

select a.Id, a.AgentId, a.EmailId, a.AdTitle, a.AdDesc, 
       (select count(*) 
        from AdComment b 
        where a.Id = b.AdId),
       (select count(*) 
        from MyLikes c 
        where c.email = 'nik@gmail.com' and 
            a.Id = c.AdId)
from Ad a

【讨论】:

    【解决方案2】:

    假设 LikeID 和 ComId 是 MyLikes 和 AdComment 表的唯一 id 字段,那么您应该能够只使用一对连接并计算每个表中的不同 id 字段:-

    SELECT a.Id,
            a.AgentId,
            a.EmailId,
            a.AdTitle,
            a.AdDesc,
            COUNT(DISTINCT m.LikeId) AS MyCount,
            COUNT(DISTINCT c.ComId) AS ComCount
    FROM Ad a
    LEFT OUTER JOIN MyLikes m ON m.email = 'nik@gmail.com' AND a.Id = m.AdId
    LEFT JOIN AdComment c ON a.Id = c.AdId 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 2017-01-10
      相关资源
      最近更新 更多