【发布时间】: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子句。 -
不应该有一个分组...关于手头的问题提供了样本返回。是的,因为涉及到分页,所以使用了限制和偏移量......对于这篇文章,查询已经被简化了。所以,就像我在帖子中所说的那样......是否有可能或者是否需要单独的查询来获取所有结果的特定列的总和/计数。