MySQL连接问题

MySQL连接问题,mysql,join,Mysql,Join,以下查询为我返回奇怪的结果: 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`.`Statisti

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

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
我在一个表结构上查询它,如下所示:

仅与统计相关的数据。统计数据=8

投票 意见 评论 现在,如果运行此查询,将得到以下结果集:

StatisticID    Score    Views   Comments
     8           5        5        5
我不知道5是从哪里来的——评论的数量——如果我把评论声明拿出来,这就行了。有人可以调试这个,因为这是我力所能及的,我对SQL比较陌生

谢谢,
Ross

当这样连接时,您将复制数据的次数与在其他表中找到匹配行的次数相同。如果每个表中只有一个对应的行,就可以了

在不分组的情况下运行此查询,您将了解为什么在所有计数上都得到相同的结果。然而,我猜你会得到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` s LIMIT 0, 10
如果输出结果很大,则会出现某些性能问题。您可以通过连接其中一个表来对其进行一些优化,但是我不确定queryparser是否足够聪明,可以为每个分组的项只运行一次。希望是这样。否则,您可以将其拆分为不同的查询。

像这样连接时,您将复制数据的次数与在其他表中找到匹配行的次数相同。如果每个表中只有一个对应的行,就可以了

在不分组的情况下运行此查询,您将了解为什么在所有计数上都得到相同的结果。然而,我猜你会得到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` s LIMIT 0, 10
如果输出结果很大,则会出现某些性能问题。您可以通过连接其中一个表来对其进行一些优化,但是我不确定queryparser是否足够聪明,可以为每个分组的项只运行一次。希望是这样。否则,您可以将其拆分为不同的查询。

假设您在投票/视图/评论上有一个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

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

假设您在投票/视图/评论中有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

没有测试它,但认为它应该工作。我们必须使用不同的字段,因为统计人员在给定的组中总是相同的…

Ross,您能提供更好的表格视图吗?我不能完全确定我看到的是ERD还是你在表中存储了什么。罗斯,你能提供一个更好的表视图吗?我不完全确定我看到的是ERD还是表中存储的内容。我不担心性能问题-此子查询解决方案将完美执行,不会执行任何虚假操作!我想如果外部结果有1000行,那么它也需要运行3000个子查询。在这种情况下,一次连接一个表并调用查询3次可能会更快。同意子查询的事情-如果有很多外部结果。但我想目前我们确实有0,10的限制。另外,您已经从投票中选择了两次,第三个suybquery应该来自commentsHm,我确实改变了这一点,不知何故我的编辑被还原了,或者这是更新中的一个小故障。谢谢,如果您没有向我指出:我不会担心性能问题-此子查询解决方案将完美执行,不要做任何虚假的行为!我想如果外部结果有1000行,那么它也需要运行3000个子查询。在这种情况下,一次连接一个表并调用查询3次可能会更快。同意子查询的事情-如果有很多外部结果。但我想目前我们确实有0,10的限制。另外,您已经从投票中选择了两次,第三个suybquery应该来自commentsHm,我确实改变了这一点,不知何故我的编辑被还原了,或者是更新中的一个小故障。谢谢,如果您没有向我指出这一点,我就不会意识到性能问题:实际上,这是一个更好的解决方案。我不知道可以在一个计数内使用DISTINCT,只是测试了一下就可以了。实际上,这是一个更好的解决方案。不知道可以在一个计数内使用DISTINCT,只是测试了一下,它就工作了。
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