【问题标题】:MYSQL Sum and Count on different tables, in same query在同一查询中,不同表上的 MYSQL Sum 和 Count
【发布时间】:2013-10-22 15:15:13
【问题描述】:

我正在尝试获取一些统计信息;来自 3 个不同表格的总链接、用户和视图。 我在尝试什么:

SELECT SUM(p.views), COUNT(c.id), COUNT(u.id)
FROM studenkel_userprefs as p, studenkel_content as c, studenkel_users as u

如果我在三个不同的查询中单独执行它们,它们可以正常工作,但结果会比我想要的高几千倍。我猜它们以某种方式相乘,提示?

谢谢

编辑:谢谢大家,非常感谢您的帮助,已解决。

【问题讨论】:

  • 当您以这种方式列出表格FROM studenkel_userprefs as p, studenkel_content as c, studenkel_users as u 时,它将为您提供三个表格中所有行的笛卡尔积,也称为CROSS JOIN,您应该使用INNER JOIN,但您需要要指定这三个表之间的关系,请更新您的问题并说明它们之间的关系。
  • 该查询将导致笛卡尔连接,您需要将您的表连接在一起。
  • 使用正确的 JOIN 语法,并告诉数据库 HOW 这些表相互关联,例如在这种情况下,您需要一个 where 子句:... WHERE studenkel_userprefs.foo = studenkel_content.bar AND etc....

标签: php mysql sql count sum


【解决方案1】:

您在 from 中所做的称为无条件的隐式内部连接。

这意味着你的最终视图有 p.rows * c.rows * u.rows 行,这就是你得到奇怪结果的原因。

如果您有 3 个问题,请分别提出,而不是一次全部提出。

或者,如果你真的只想要一个请求,你可以使用一些丑陋的东西:

SELECT
  SELECT SUM(views) FROM studenkel_userprefs as "sum_userprefs",
  SELECT COUNT(id) FROM studenkel_content as "cnt_content",
  SELECT COUNT(u.id) FROM studenkel_users as "cnt_users"
FROM DUAL;

【讨论】:

    【解决方案2】:

    你可以“作弊”吗?

    SELECT
        (
            SELECT 
                SUM(p.views)
            FROM 
                studenkel_userprefs as p
        ) as `views`,
        (
            SELECT
                COUNT(c.id)
            FROM
                studenkel_content as c
        ) as `content_count`,
        (
            SELECT
                COUNT(u.id)
            FROM
                studenkel_users as u
        ) as `user_count`
    

    【讨论】:

      【解决方案3】:

      这是因为您正在对表进行笛卡尔连接,它将一个表中的行数乘以另一个表中的行数。如果不指定 JOIN ... ON 格式的连接或在 WHERE 子句中指定连接条件,您将得到的唯一结果。

      【讨论】:

        猜你喜欢
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        相关资源
        最近更新 更多