mysql 3个表,多个计数按分组,但是被卡住了

zy1mlcev  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(347)

我在查询时遇到了一些麻烦。我试图检索一个大数据库的一些数据,其中涉及3个表。
这些表包含有关添加的数据,在后端网站中,管理员可以管理要显示的本地添加、位置等。。。这些表分为3个表,其中1个表包含与adds信息(名称、可用日期、过期日期等)相关的所有数据。然后,还有另外两个表,其中包含一些额外的信息,但只是关于视图或单击。
所以我只有15个添加,有多个点击和多个视图。每次单击并查看表时,为每次单击注册一个新行。因此,当一个click被注册时,它将添加一个新行,其中addid\u views是一个寄存器(click),addid是addid from adds\u table。例如,add(1)将有2个视图和2次单击,而add(2)将有1个视图和1次单击。
我的想法是得到每一个添加,多少点击和意见,共有。
我有三张这样的table:

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

结果将是一个单独的表,我在其中检索每个add(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一直在加载,有什么办法可以帮助我知道我遗漏了什么吗?
顺便说一句,我发现这个帖子处理的问题和我的几乎一样,你可以看到我的查询与第一个答案非常相似,但我一直收到加载消息。没有错误,只是加载。
编辑:我把数字放错了,弄糊涂了。现在这些表都修好了,我补充了一些解释。
edit2:我用showcreatetables定义更新了帖子。
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;
dced5bon

dced5bon1#

我最终找到了解决问题的办法。我试图访问的表太大了,这是导致工程数据库不好的原因,在adds\u views\u表中,对于每个视图,都会添加一个新行。以近300万行结束,表的权重几乎占整个数据库的35%(326mb)。
当phpmyadmin试图执行一个查询时,由于mysql应用了超时限制,所以一直加载,并且从未显示结果。更改此值会有所帮助,但无法检索该数据并将其显示在网站上(这意味着在执行查询之前不会加载该网站或数据)。
由于在adds\u表中创建了addid的索引,这个问题得到了解决。此外,如果出于某种原因使用子查询,查询速度会更快。查询结果如下:

SELECT a.addid,
(SELECT COUNT(addid) FROM adds_clicks_table WHERE addid = a.addid) AS 'clicks',(SELECT COUNT(addid) FROM adds_views_table WHERE addid = a.addid) AS 'views'
FROM adds_table a
ORDER BY a.addid;

感谢@rick james,他发布了一个类似的查询,我结束了修改它以获得所需的数据
原谅我糟糕的英语

wecizke3

wecizke32#

如果你有旧版本,

SELECT  a.addid, 
                ( SELECT  COUNT(addid_clicks)
                    FROM  `adds_clicks_table`
                    WHERE  addid = a.addid 
                ) AS 'clicks', 
                ( SELECT  COUNT(addid_clicks)
                    FROM  `adds_views_table`
                    WHERE  addid = a.addid 
                ) AS 'views'
            FROM  adds_table AS a

对于5.6及更高版本,这可能更快:

SELECT  a.addid, c.clicks, v.views
    FROM  `adds_table` a
    LEFT JOIN ( SELECT addid, COUNT(addid_clicks) FROM addid_clicks ) AS c USING(addid)
    LEFT JOIN ( SELECT addid, COUNT(addid_views)  FROM addid_views )  AS v USING(addid)

如果你得到 NULLs 但更喜欢 0s ,然后将值 Package 在 IFNULL(..., 0) .
如果您需要进一步讨论,请提供 SHOW CREATE TABLE 以及 EXPLAIN SELECT ...

afdcj2ne

afdcj2ne3#

如果这些确实是您的表(一列,加上一个auto\u 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 (等)而不是插入其他表格。

相关问题