このクエリで問題が発生しました:
INSERT INTO unit_storage (user_id,diagram_id,amount)
SELECT uf.user_id,
uf.diagram_id,
uf.amount
FROM unit_factory uf
WHERE uf.production_finish_time < /*current unix epoch seconds*/
AND uf.user_id = /*provided user id*/ ON DUPLICATE KEY
UPDATE unit_storage.amount=unit_storage.amount+uf.amount
それが起こっている例と私の望ましい効果は何であるかから始めましょう…
比較された値から推測できるように、production_finish_timeは整数列であり、秒単位の時間が特定の日付を示しています。
unit_factoryテーブルの行を見てください。
+-----+----------+-------------+---------+-------------------------+--+
| id | user_id | diagram_id | amount | production_finish_time | |
+-----+----------+-------------+---------+-------------------------+--+
| 7 | 10 | 2 | 1 | 1521472903 | |
| 8 | 10 | 2 | 1 | 1521473704 | |
| 9 | 10 | 2 | 1 | 1521473729 | |
| 10 | 10 | 2 | 1 | 1521474294 | |
+-----+----------+-------------+---------+-------------------------+--+
クエリを実行すると、unit_storageテーブルはunit_factoryテーブルのコピーになります。
+-----+----------+-------------+---------+--+
| id | user_id | diagram_id | amount | |
+-----+----------+-------------+---------+--+
| 16 | 10 | 2 | 1 | |
| 17 | 10 | 2 | 1 | |
| 18 | 10 | 2 | 1 | |
| 19 | 10 | 2 | 1 | |
+-----+----------+-------------+---------+--+
私が必要とする結果は次のとおりです。
+-----+----------+-------------+---------+--+
| id | user_id | diagram_id | amount | |
+-----+----------+-------------+---------+--+
| 16 | 10 | 2 | 4 | |
+-----+----------+-------------+---------+--+
目的の結果に対する正しいクエリは何ですか?
編集:
要求に応じて、両方のテーブルのインデックス:
--
-- Indexes for table `unit_storage`
--
ALTER TABLE `unit_storage`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `unit_factory`
--
ALTER TABLE `unit_factory`
ADD PRIMARY KEY (`id`);
以下のためon duplicate key
のトリガーに、キーが存在しなければなりません。
ALTER TABLE unit_storage ADD CONSTRAINT key1 UNIQUE (user_id, diagram_id)
ここでの作業例だSQLフィドルが。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加