0

model、model_views、および model_views2 の 3 つのテーブルがあります。集約されたビューを保持するために行ごとに 1 つの列を作成するために、ビュー用の新しい列を使用して、モデルを次のように見せるための移行を行いました。

+---------------+---------------+------+-----+---------+----------------+
| 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 は巨大で、どちらも合計で数千万行になります。各行は 1 つのビューを表しており、これはパフォーマンスにとってひどい混乱です。これまでのところ、この 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

サブクエリUPDATEで 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 に答える