1

以下查询为我返回了奇怪的结果:

SELECT
    `Statistics`.`StatisticID`,
    COUNT(`Votes`.`StatisticID`) AS `Score`,
    COUNT(`Views`.`StatisticID`) AS `Views`,
    COUNT(`Comments`.`StatisticID`) AS `Comments`
FROM `Statistics`
LEFT JOIN `Votes` ON `Votes`.`StatisticID` = `Statistics`.`StatisticID`
LEFT JOIN `Views` ON `Views`.`StatisticID` = `Statistics`.`StatisticID`
LEFT JOIN `Comments` ON `Comments`.`StatisticID` = `Statistics`.`StatisticID`
GROUP BY `Statistics`.`StatisticID`
LIMIT 0, 10

我在如下表结构上查询这个:

(仅与 相关的数据Statistics.StatisticID = 8

投票

StatisticID
    8

意见

StatisticID
    8
    8

评论

StatisticID
    8
    8
    8
    8
    8

现在,如果我运行此查询,我会得到以下结果集:

StatisticID    Score    Views   Comments
     8           5        5        5

我知道 5 来自哪里——评论的数量——如果我把评论声明拿出来,这很有效。任何人都可以调试它,因为这超出了我的能力范围(我对 SQL 比较陌生)。

谢谢,罗斯

4

2 回答 2

4

像这样加入时,您将复制数据的次数与您在其他表中找到的数学行一样多。这很好,如果每个表中只有 1 个对应的行。

在没有分组的情况下运行此查询,您将了解为什么在所有方面都得到相同的结果。然而,我猜你会得到 10 作为每个字段的计数 (1*2*5) 如果你想解决这个问题,你需要为每个计数调用一个子选择。

选择
    s.`StatisticID`,
    (SELECT COUNT(*) FROM Votes WHERE Votes.StatisticID = s.StatisticID) 作为分数,
    (SELECT COUNT(*) FROM Views WHERE Views.StatisticID = s.StatisticID) 作为视图,
    (SELECT COUNT(*) FROM Comments WHERE Comments.StatisticID = s.StatisticID) 作为评论,
FROM `Statistics` s
限制 0, 10

如果外部结果很大,则存在某些性能问题。您可以通过加入其中一个表来对其进行一些优化,但是我不确定查询解析器是否足够聪明,只能为每个分组项目运行 1 次。希望它会。否则,您可以将其拆分为不同的查询。

于 2008-11-20T22:34:11.880 回答
2

假设您在投票/视图/评论中有一个 id 字段或类似字段:

SELECT
    `Statistics`.`StatisticID`,
    COUNT(DISTINCT `Votes`.`VoteID`) AS `Score`,
    COUNT(DISTINCT `Views`.`ViewID`) AS `Views`,
    COUNT(DISTINCT `Comments`.`CommentID`) AS `Comments`
FROM `Statistics`
LEFT JOIN `Votes` ON `Votes`.`StatisticID` = `Statistics`.`StatisticID`
LEFT JOIN `Views` ON `Views`.`StatisticID` = `Statistics`.`StatisticID`
LEFT JOIN `Comments` ON `Comments`.`StatisticID` = `Statistics`.`StatisticID`
GROUP BY `Statistics`.`StatisticID`
LIMIT 0, 10

没有测试它,但认为它应该工作。(我们必须使用不同的字段,因为 statisticID 在给定组中总是相同的......)

于 2008-11-20T23:40:16.943 回答