【问题标题】:mysql count joinmysql 计数加入
【发布时间】:2011-11-28 13:05:10
【问题描述】:
SELECT A.id as ActivityId, A.description, T.id, T.title, COUNT(R.*) as reactionCount
FROM activities 
LEFT JOIN activitiesReactions as R ON R.activityId = A.id
LEFT JOIN activitiesTags as T ON A.tagId = T.id

所以基本上我需要一个查询来获取所有活动,同时不获取该活动的反应,而是获取反应的 COUNT,这些反应位于另一个名为 activityReactions 的表中,我该怎么做(请参阅上面我想到的查询)。

所以查询应该返回:

array('activityId' => 3, 'description' => 'doing work', 'reactionCount' => 2)

示例行:

Activities table:
id | description
 3   doing work
 4   checking mail

ActivitiesReactions table:
id | activityId | message
 1            3   you never do anywork, so that must be bullshit.
 2            3   yes I do alot of work!

所以现在它应该在我执行查询并执行 WHERE A.id = 3 时在反应计数上返回“2”


SELECT A.id as ActivityId, A.description, COUNT(R.activityId) AS reactionCount
FROM activities 
LEFT JOIN activitiesReactions as R
ON R.activityId = A.id
GROUP BY A.id

确实有效,但反应计数返回 * 2,例如,如果有 3 个反应,反应计数 = 6,2 个反应反应计数 = 4 等等。

【问题讨论】:

  • 你的例子没有任何意义......你怎么想出2作为结果?此外,您的数组与您向我们展示的行不匹配
  • 大声笑你是对的,现在已经修复了

标签: mysql sql join count


【解决方案1】:

您的查询只需要一个group by 子句即可使其工作,例如。

SELECT A.id as ActivityId, A.description, COUNT(R.*) 
FROM activities 
    LEFT JOIN activitiesReactions as R ON R.activityId = A.id
GROUP BY A.id, A.description;

【讨论】:

  • 您不需要在 MySQL 的 group by 中使用 A.description。你只需要:GROUP BY A.id
【解决方案2】:

如果要统计每个活动的反应次数,则必须在加入两个表后按activity.id 分组:

SELECT A.id as ActivityId, A.description, COUNT(*) AS reactionCount
FROM activities 
LEFT JOIN activitiesReactions as R
ON R.activityId = A.id
GROUP BY A.id

【讨论】:

  • 好吧,reactionCount 应该只有 COUNT(R.*) 这给我一个错误,这是不可能的吗?问题是我也加入了其他表。 (修正了我的例子)
  • 好吧,但由于某种原因,计数是实际计数的 2*,有什么线索吗?所以如果有 2 个反应,reactionCount = 4,如果有 3 个反应,reactionCount = 6
  • @user1066101, @ypercube:按*R 的id 列分组都没有关系(由于join 的性质,id 永远不会为空,所以确实如此没有任何区别)。 @user1066101:如果你额外加入标签,你将永远得到COUNT(*) times number_of_tags_per_activity。如果你没有很好的理由,我不会加入标签表……
  • 我只需要获取活动的标签,我应该把它放在不同的查询中吗?
  • 我认为您的数据库架构有缺陷(或者您的示例再次不正确)......您现在加入表格的方式,每个活动只能有一个标签(然后它没有解释为什么你得到多行......)。但是,是的,您应该在不同的查询中查询标签,否则您将不会得到您想要的结果……(不要仅仅因为您可以而尝试在一个单一的情况下执行多项操作 – 使用对正确工作的正确查询)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 2012-06-18
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多