【问题标题】:MySQL merge results into table from count of 2 other tables, matching idsMySQL 从其他 2 个表的计数中将结果合并到表中,匹配 id
【发布时间】:2023-04-05 15:23:03
【问题描述】:

我有 3 个表:model、model_views 和 model_views2。为了让每行有一列来保存聚合视图,我进行了迁移以使模型看起来像这样,并为视图添加了一个新列:

+---------------+---------------+------+-----+---------+----------------+
| Field         | Type          | Null | Key | Default | Extra          |
+---------------+---------------+------+-----+---------+----------------+
| id            | int(11)       | NO   | PRI | NULL    | auto_increment |
| user_id       | int(11)       | NO   |     | NULL    |                |
|  [...]        |               |      |     |         |                |
| views         | int(20)       | YES  |     | 0       |                |
+---------------+---------------+------+-----+---------+----------------+

这是 model_views 和 model_views2 的列的样子:

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(11)          | NO   | PRI | NULL    | auto_increment |
| user_id    | smallint(5)      | NO   | MUL | NULL    |                |
| model_id   | smallint(5)      | NO   | MUL | NULL    |                |
| time       | int(10) unsigned | NO   |     | NULL    |                |
| ip_address | varchar(16)      | NO   | MUL | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

model_views 和 model_views2 非常庞大,每个都有数千万行。每一行代表一个视图,这对性能来说是一团糟。到目前为止,我已经有了这个 MySQL 命令来获取这两个表中代表单个视图的所有行的计数,按 model_id 加起来排序:

SELECT model_id, SUM(c) FROM (
    SELECT model_views.model_id, COUNT(*) AS c FROM model_views
    GROUP BY model_views.model_id
    UNION ALL
    SELECT model_views2.model_id, COUNT(*) AS c FROM model_views2
    GROUP BY model_views2.model_id)
AS foo GROUP BY model_id

这样我就得到了一张漂亮的大桌子,上面有以下内容:

+----------+--------+
| model_id | SUM(c) |
+----------+--------+
| 1        | 1451   |
| [...]    |        |
+----------+--------+

从这里开始执行命令以将 SUM(c) 的值合并到列 model.views 中的最安全途径是什么,由我从上述 SQL 查询中得到的 model.id 与 model_ids 匹配?我只想为仍然存在的模型填充行 - 可能有 model_views 引用模型表中已删除的行。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以在子查询中使用 UPDATEJOIN

    UPDATE model
       JOIN (
           SELECT model_views.model_id, COUNT(*) AS c 
           FROM model_views
           GROUP BY model_views.model_id
           UNION ALL
           SELECT model_views2.model_id, COUNT(*) AS c 
           FROM model_views2
           GROUP BY model_views2.model_id) toupdate ON model.id = toupdate.model_id
    SET model.views = toupdate.c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多