我有 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 引用模型表中已被删除的行。
最佳答案
您可以在子查询上使用 UPDATE
和 JOIN
:
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/