gpt4 book ai didi

MySQL 加入问题

转载 作者:行者123 更新时间:2023-11-29 04:14:42 25 4
gpt4 key购买 nike

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

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 比较陌生)。

谢谢,罗斯

最佳答案

当像这样连接时,您将复制数据的次数与您在其他表中找到数学行的次数相同。如果每个表中只有 1 个对应行,这很好。

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

SELECT    s.`StatisticID`,    (SELECT COUNT(*) FROM Votes WHERE Votes.StatisticID = s.StatisticID) AS Score,    (SELECT COUNT(*) FROM Views WHERE Views.StatisticID = s.StatisticID) AS Views,    (SELECT COUNT(*) FROM Comments WHERE Comments.StatisticID = s.StatisticID) AS Comments,FROM `Statistics` sLIMIT 0, 10

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

关于MySQL 加入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/307019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com