【问题标题】:Mysql join table and count rowsMysql连接表并计算行数
【发布时间】:2014-05-09 20:39:44
【问题描述】:

我有两张桌子:cmets & photos

每个 cmets 都通过照片 ID “连接”到特定照片。我想获取来自某个作者(author_id)的所有照片,以及特定照片上所有 cmets 的计数。对不起我的英语,但我认为这是我能描述它的最好方式。

我想要一张桌子:

  • id(照片表)
  • 评分(照片表)
  • created_at(照片桌)
  • number_of_cmets(cmets 表)

到目前为止我尝试过的(语法错误):

"SELECT p.id, p.rating, p.created_at, x.*
FROM photos p 
LEFT JOIN 
(
    SELECT photo_id, COUNT(*) as cc
    FROM comments
    GROUP BY photo_id
) x 
ON x.photo_id= p.id"

错误:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 '"SELECT p.id, p.rating, p.created_at, x.* 附近使用的正确语法FROM photos p LEFT JOIN (SELECT' at line 1"

照片表

  • 身份证
  • author_id
  • 文件名
  • 标题
  • 评分
  • 标志
  • is_active

cmets 表

  • 身份证
  • 评论
  • author_id
  • photo_id
  • created_at
  • 标志
  • is_active

【问题讨论】:

  • 您是否遇到任何错误?
  • “到目前为止我已经尝试过什么(有语法错误)” - 你能分享一下错误吗?
  • 您的查询中没有语法错误
  • 我刚刚将错误添加到我的帖子中
  • 您的查询中仍然没有语法错误。尝试直接从您的源代码中复制它。

标签: mysql sql database


【解决方案1】:

这样,它会以更少的资源需求更快地工作,并且更易于阅读:)

SELECT p.id, p.rating, p.created_at, count(c.id) AS cnt
FROM photos p 
    LEFT JOIN comments c ON c.photo_id=p.id
GROUP BY p.id

【讨论】:

  • 您可以将它们按组添加,但我相信它们不是必需的,因为p.id 是每张照片唯一的主键。
  • 尽管我的查询实际上似乎有效,但显然,这种方式比我的解决方案聪明得多!赞成并将在 2 分钟内将其标记为答案,当我能够做到时。谢谢朋友
  • rating 和 created_at 对于每个 id 应该是相同的,因此 MySQL 不会产生错误的结果 - MySQL 会执行查询而不会出错。
  • ...而且速度更快,因为不需要光标
  • 我也会使用这个解决方案,不是我的:)
【解决方案2】:

请注意,编写此查询的最快方法可能是:

SELECT p.*,
       (SELECT count(*) FROM comments c WHERE c.photo_id = p.id) AS cnt
FROM photos p
WHERE p.author_id = 1;

为获得最佳性能,请在 comments(photo_id) 上创建索引。

我提供这个是因为性能被作为一个考虑因素。 joingroup by 方法也是编写查询的好方法。

【讨论】:

  • 这不会返回上述解决方案所做的事情。我希望查询返回某个作者(author_id)的照片信息和照片上的评论数。你的返回所有照片。我建议进行编辑:) ty
  • @ThomasTeilmann 。 . .如果您想获取有关特定作者的信息,可以添加 where 条件。看起来您的原始语法错误是由于 SQL 语句开头的双引号引起的。
  • 是的,我想通了 :) 看起来是复制粘贴错误。 ty :)
  • 您的查询非常适合我的问题,因为我发现之前接受的答案实际上并没有解决问题,所以我接受了您的答案。
  • @ThomasTeilmann 在您上面的问题中您没有要求 author_id 的东西,所以... :) 此解决方案也仅适用于 1 个特定作者。你最好做SELECT p.author_id, p.id, (SELECT count(*) ...) cnd FROM photos p WHERE p.author_id=1 (optional where clause) GROUP BY p.author_id, p.id。这将返回每个作者 + 每张照片 + 每张照片的 cmets 计数。
猜你喜欢
  • 2013-07-12
  • 2011-08-15
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 2011-01-12
  • 1970-01-01
  • 2021-12-12
相关资源
最近更新 更多