【发布时间】:2018-12-01 22:18:28
【问题描述】:
我在查询时遇到了一些麻烦。我正在尝试检索涉及 3 个表的大型数据库的一些数据。
这些表包含有关添加的数据,在后端网站中,管理员可以管理他想要显示的本地添加、位置等...这些被组织在 3 个表中,其中 1 个包含所有数据与添加信息(名称、可用日期、到期日期等)相关的信息。然后,还有另外 2 个表格,其中包含一些额外的信息,但只是关于视图或点击。
所以我只有 15 个添加,它们具有多次点击和多次查看。 每次点击并查看表格,每次点击都会注册一个新行。因此,当点击注册时,它会添加一个新行,其中 addid_views 是一个注册(点击),并且 addid 是 addid 来自 add_table。例如,添加 (1) 将有 2 次查看和 2 次点击,而添加 (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 where 处理的问题几乎与我遇到的相同,您可以看到我的查询与第一个答案非常相似,但我收到了正在加载的消息时间。没有错误,正在加载中。
编辑:我把数字放错了,弄错了。现在表格是固定的,我添加了一些关于它的解释。
Edit2:我用 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;
【问题讨论】:
-
您没有提供足够的信息让我们帮助您。请read this note about asking good SQL questions,并关注查询性能部分。那么请edit你的问题。
-
抱歉,我在做表格时弄糊涂了。我希望现在它更容易理解了。
-
您使用的是什么版本的 MySQL? (对查询的一项改进在旧版本中效果不佳。)
-
我们仍然需要查看带有索引的表定义来帮助您。
-
使用Mysql 5.6.38。我将使用 3 个 CREATE TABLE 定义更新帖子。
标签: mysql group-by count query-performance