Mysql 3表,多个计数分组,但卡住了

标签 mysql group-by count query-performance

我在执行查询时遇到了一些问题。我正在尝试检索涉及 3 个表的大型数据库的一些数据。

这些表包含有关添加的数据,在后端网站中,管理员可以管理他想要显示的本地添加、位置等...这些表组织在 3 个表中,其中 1 个包含所有数据与添加信息相关(名称、可用日期、到期日期等)。然后,还有另外 2 个表,其中包含一些额外信息,但只是关于 View 或点击次数。

所以我只有 15 个添加,它们有多次点击和多次查看。 每次点击并查看表,为每次点击注册一个新行。所以,当注册一个点击时,它会添加一个新行,其中addid_views是一个寄存器(点击),addid是adds_table中的addid。例如,add (1) 将有 2 次查看和 2 次点击,而 add (2) 将有 1 次查看和 1 次点击。

我的想法是获取每个添加的总共有多少点击次数和浏览次数。

我有 3 个这样的表:

         adds_table           adds_clicks_table        adds_views_table
    +-------+-----------+   +-------------+------+     +-------------+------+  
    | addid | name      |   | addid_click |addid |     | addid_views |addid |
    +-------+-----------+   +-------------+------+     +-------------+------+
    | 1     | add_name1 |   | 1           | 1    |     | 1           | 1    |
    +-------+-----------+   +-------------+------+     +-------------+------+
    | 2     | add_name2 |   | 2           | 2    |     | 2           | 1    |
    +-------+-----------+
    | 3     | add_name3 |   | 3           | 1    |     | 3           | 2    |
    +-------+-----------+   +-------------+------+     +-------------+------+


CREATE TABLE `bwm_adds` (
  `addid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  ...
  PRIMARY KEY (`addid`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8

CREATE TABLE `bwm_adds_clicks` (
  `add_clickid` int(19) NOT NULL AUTO_INCREMENT,
  `addid` int(11) NOT NULL,
  ...
  PRIMARY KEY (`add_clickid`)
) ENGINE=InnoDB AUTO_INCREMENT=3374 DEFAULT CHARSET=utf8


CREATE TABLE `bwm_adds_views` (
  `add_viewsid` int(19) NOT NULL AUTO_INCREMENT,
  `addid` int(11) NOT NULL,
  ...
  PRIMARY KEY (`add_viewsid`)
) ENGINE=InnoDB AUTO_INCREMENT=2078738 DEFAULT CHARSET=utf8

结果将是一个表格,我在其中检索每个添加 (addid) 的点击次数和浏览次数。

我需要获取所有查询,其中我得到如下内容:

+-------+---------+-----------+
| addid | clicks  | views     |
+-------+---------+-----------+
| 1     | 123123  | 235457568 |
+-------+---------+-----------+
| 2     | 5124123 | 435345234 |
+-------+---------+-----------+
| 3     | 123541  | 453563623 |
+-------+---------+-----------+

我尝试执行查询,但它被卡住并加载了未定义的时间...我很确定我的查询会失败,因为如果我删除其中一个计数,则会非常快地显示一些数据。

SELECT a.addid, COUNT(ac.addid_clicks) as 'clicks', COUNT(av.addid_views) as 'views'
        FROM `adds_table` a 
        LEFT JOIN `adds_clicks_table` ac ON a.addid = ac.addid_click
        LEFT JOIN `adds_views_table` av ON ac.addid_click = av.addid_views
                GROUP BY a.addid

Mysql 一直在加载,有什么想法可以帮助知道我缺少什么吗?

顺便说一句,我发现了this post其中处理几乎与我遇到的问题相同的问题,您可以看到我的查询与第一个答案非常相似,但我始终收到“正在加载”消息。没有错误,只是正在加载。

编辑:我放错了数字并感到困惑。现在表格已经固定了,我添加了一些关于它的解释。

编辑2:我用 SHOW CREATE TABLES DEFINITIONS 更新了帖子。

Edit3:有什么方法可以优化这个查询吗?看起来它检索到了我想要的结果,但是 mysql 数据库取消了查询,因为它的执行时间超过了 30 秒。

SELECT a.addid,
       (SELECT COUNT(addid) FROM add_clicks where addid =  a.addid) as clicks,
       (SELECT COUNT(addid) FROM add_views  where addid =  a.addid) as views
    FROM adds a ORDER BY a.addid;

最佳答案

如果这些确实是您的表(一列,加上 auto_inc),那么没有任何有意义的信息可以证明拥有 3 个表而不是 1 个表:

CREATE TABLE `bwm_adds` (
  `addid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  clicks INT UNSIGNED NOT NULL,
  views  INT UNSIGNED NOT NULL,
  PRIMARY KEY (`addid`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8

然后UPDATE ... SETviews=views+1(等等)而不是插入到其他表中。

关于Mysql 3表,多个计数分组,但卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50987902/

相关文章:

MySQL 根据不同表的条件进行计数

mysql - 如何理解 "can' t connect”mysql错误信息?

android - JSON Android 解析。卡在对话框中

MySQL 按顺序和计数分组(不同)

mysql - 从分组行中的同一列获取特定值

xml - 使用 XSLT 计算 XML 中字符串的出现次数

mysql - 使用 LIKE 对同一列计算不同的值

mysql - 如何获取最大数量用户投票的最大评分MovieId

sql - 我如何分组连接每一行?

r - 查找包含一小部分 0 的最大长度子向量