0

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

4

1 回答 1

1

您可以在子查询上使用UPDATEwith a :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
于 2013-07-21T20:50:03.337 回答