我在查询时遇到了一些麻烦。我正在尝试检索涉及3个表的大型数据库的一些数据。
这些表包含有关添加的数据,在后端网站上,管理员可以管理要显示的本地添加,位置等信息。这些表分为3个表,其中1个表包含所有相关数据添加信息(名称,可用日期,到期日期等)。然后,还有另外两个表,其中包含一些额外的信息,但仅涉及视图或点击。
因此,我只有15个添加项,它们具有多次点击和多次查看。
每次单击和查看表都为每次单击注册一个新行。因此,当单击被注册时,它将添加一个新行,其中addid_views是一个寄存器(单击),而addid是add_table中的addid。因此,例如,添加(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会在其中处理几乎与我相同的问题,您可以看到我的查询与第一个答案非常相似,但是我始终得到“正在加载”消息。没有错误,只有加载。
编辑:我放错了数字,并感到困惑。现在表格已修复,我添加了一些解释。
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;
最佳答案
如果这些表确实是您的表(一列,再加上一个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 ... SET views = views + 1
(等),而不是插入其他表中。