MySQL 将其他 2 个表的计数结果合并到表中,匹配 ID

标签 mysql sql

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

+---------------+---------------+------+-----+---------+----------------+
| 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 非常庞大,各自总计有数千万行。每一行代表一个 View ,这对性能来说是一团糟。到目前为止,我已经有了这个 MySQL 命令来获取这两个表中表示单个 View 的所有行的计数,并按 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

这样我就得到了一张漂亮的大 table ,其中包含以下内容:

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

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

最佳答案

您可以在子查询上使用 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

关于MySQL 将其他 2 个表的计数结果合并到表中,匹配 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17776651/

相关文章:

php - if 语句取决于数组中数据的存在,但如何在检查数组时不丢失数组中的第一项?

php - 在 PHP MySQL 查询中无法搜索以获取 OR 语句

mysql - 在 alpha 字符上匹配两个 mysql 列(忽略同一字段中的数字)

php - LEFT JOIN 与 SUM 不工作

python - 如何在常规 SQL 中编写此 Django 查询?

java - MySQL,在 Java 应用程序中使用 JDBC - 看似空的结果集,但查询格式正确

MYSQL:多表连接 - 以先前的连接为条件

sql - 如何做 Firebird SP, SELECT * FROM "TABLE"?

php - 在此 foreach 循环中设置 PHP 变量

通过powershell使用/变量进行SQL查询