【问题标题】:sum and count with joined tables使用连接表求和和计数
【发布时间】:2018-04-18 01:50:29
【问题描述】:

还没有遇到过这样的情况,所以不知道如何纠正它。我猜需要子查询?

我需要 votes.vote 的 SUM 和 votes.vote 的 COUNT。这使我可以计算所选位置的评分(所有投票的总和 / 投票数 = 评分)。

这里是带有 * 和静态绑定的查询,以便于理解:

//prepare
$stmt = $db->prepare("
    SELECT SQL_CALC_FOUND_ROWS
        *,
        COALESCE(SUM(votes.vote),0) AS vote_total,
        COUNT(votes.vote) AS number_votes
    FROM locations
    LEFT JOIN tables
        ON tables.location_id = locations.location_id
    LEFT JOIN votes
        ON votes.location_id = locations.location_id
    LEFT JOIN events
        ON events.location_id = locations.location_id
    WHERE locations.location_id = :location_id
    LIMIT :limit OFFSET :offset
");

//bindings
$binding = array(
    'location_id' => 11,
    'limit' => 20,
    'offset' => 0
);

//execute
$stmt->execute($binding);

//results
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

有 11 个活动加入到此位置。只有两票加入它(值 3 和值 4)。我得到以下信息:

[vote_total] => 77 (should be 7, but is 7*11)
[number_votes] => 22 (should be 2, but is 2*11)

除此之外,只返回一个结果,而不是 11 个。如果我删除 votes 表连接并且 SUM/COUNT 选择它,所有 11 个结果都将按应有的方式显示。

是否可以通过某种方式在同一个查询中获取 votes.vote 的 SUM 和 COUNT 总数,或者是否需要单独的查询来获取这些值?

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需的结果。您显然很困惑,因为您有一个没有 GROUP BY 的聚合查询,它将返回 1 行。然而,您使用的是LIMIT 子句。
  • 不应该有一个分组...关于手头的问题提供了样本返回。是的,因为涉及到分页,所以使用了限制和偏移量......对于这篇文章,查询已经被简化了。所以,就像我在帖子中所说的那样......是否有可能或者是否需要单独的查询来获取所有结果的特定列的总和/计数。

标签: mysql join


【解决方案1】:

根据您对问题的描述,我的最佳猜测是您希望每个事件有一行。如果是这样:

SELECT SQL_CALC_FOUND_ROWS e.*
       COALESCE(SUM(v.vote), 0) AS vote_total,
       COUNT(v.vote) AS number_votes
FROM locations l LEFT JOIN
     tables
     ON t.location_id = l.location_id LEFT JOIN
     votes v
     ON v.location_id = l.location_id LEFT JOIN
     events e
     ON e.location_id = l.location_id
WHERE l.location_id = :location_id
GROUP BY e.event_id
LIMIT :limit OFFSET :offset;

【讨论】:

  • 是的,成功了,但我想我不明白为什么这里需要按 event.event_id 分组?所有事件都是唯一的,不可能有两个事件具有相同的 event_id。
  • @user756659 。 . .正如我在评论中解释的那样,没有GROUP BY 的聚合查询只返回一行。您对SUM()COUNT() 的使用使其成为聚合查询。
猜你喜欢
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 2021-10-09
相关资源
最近更新 更多