我有 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 引用模型表中已删除的行。