質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.86%

  • MySQL

    5213questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

MYSQL 既存データをインサートした場合カラムを追加するのではなく更新する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 48

wakahiro

score 10

こんにちはデータを随時更新していき最終的に日にち別で(重複はされないようにする)更新されたデータのみレコードに残したいのですがどのようにすればいいのでしょうか?
”ON DUPLICATE KEY UPDATE”を試したのですが、更新がされません。
お力を貸して頂ければ大変助かります。

MariaDB [test]> insert into plan(name,main_time)
    -> values('APLAN',15);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into plan(name,main_time) values('BPLAN',30);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into plan(name,main_time) values('CPLAN',45);
Query OK, 1 row affected (0.06 sec)

MariaDB [test]> select * from plan;
+----+-------+-----------+
| id | name  | main_time |
+----+-------+-----------+
|  1 | APLAN |        15 |
|  2 | BPLAN |        30 |
|  3 | CPLAN |        45 |
+----+-------+-----------+
MariaDB [test]> insert into user(name,old ) values('sato',20);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into user(name,old ) values('yamada',20);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into user(name,old ) values('yoshida',20);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> select * from user
    -> ;
+----+---------+------+
| id | name    | old  |
+----+---------+------+
|  4 | sato    |   20 |
|  5 | yamada  |   20 |
|  6 | yoshida |   20 |
+----+---------+------+
3 rows in set (0.00 sec)
MariaDB [test]> insert into play_task(play_day,user_id,plan_id ) values(20180517,4,2);
Query OK, 1 row affected (0.07 sec)

MariaDB [test]> insert into play_task(play_day,user_id,plan_id ) values(20180517,4,3);
Query OK, 1 row affected (0.01 sec)

MariaDB [test]> insert into play_task(play_day,user_id,plan_id ) values(20180517,4,2);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into play_task(play_day,user_id,plan_id ) values(20180517,4,3);
Query OK, 1 row affected (0.01 sec)

MariaDB [test]> select * from play_task;
+----+------------+---------+---------+
| id | play_day   | user_id | plan_id |
+----+------------+---------+---------+
|  1 | 2018-05-17 |       4 |       1 |
|  2 | 2018-05-17 |       4 |       2 |
|  3 | 2018-05-17 |       4 |       3 |
|  4 | 2018-05-17 |       4 |       2 |
|  5 | 2018-05-17 |       4 |       3 |
+----+------------+---------+---------+
5 rows in set (0.00 sec)
MariaDB [test]> insert into amount_day(
    ->     amount_day,
    ->     APLAN,
    ->     APLANcount,
    ->     BPLAN,
    ->     BPLANcount,
    ->     CPLAN,
    ->     CPLANcmount
    -> )
    -> select
    -> play_task.play_day,
    -> sum(case when play_task.plan_id = 1 then plan.main_time end ),
    -> count(play_task.plan_id = 1 or null ),
    -> sum(case when play_task.plan_id = 2 then plan.main_time end ),
    -> count(play_task.plan_id = 2 or null ),
    -> sum(case when play_task.plan_id = 3 then plan.main_time end ),
    -> count(play_task.plan_id = 3 or null )
    -> from play_task left outer join plan on
    -> play_task.plan_id = plan.id group by play_day;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [test]> select * from amount_day;
+----+------------+-------+------------+-------+------------+-------+-------------+
| id | amount_day | APLAN | APLANcount | BPLAN | BPLANcount | CPLAN | CPLANcmount |
+----+------------+-------+------------+-------+------------+-------+-------------+
|  1 | 2018-05-17 |    15 |          1 |    60 |          2 |    90 |           2 |
+----+------------+-------+------------+-------+------------+-------+-------------+
1 row in set (0.00 sec)

こちらから新しくplay_taskテーブルにデータを追加してamount_dayテーブルを更新すると更新がされません。
なおamount_dayテーブルのamount_dayカラムはUNIQUEキーに指定します。UNIQUEキーを指定しない場合更新されるのですが、
同じ日付のレコードがテーブル内に発生します。これを同じ日付のレコードは1つの状態で最終データで更新されている形でテーブルをまとめたいのですが。。可能なのでしょうか?

MariaDB [test]> insert into play_task(play_day,user_id,plan_id ) values(20180517,4,1);
Query OK, 1 row affected (0.01 sec)

MariaDB [test]> insert into play_task(play_day,user_id,plan_id ) values(20180517,4,2);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into play_task(play_day,user_id,plan_id ) values(20180517,4,3);
Query OK, 1 row affected (0.01 sec)

MariaDB [test]> select * from play_task;
+----+------------+---------+---------+
| id | play_day   | user_id | plan_id |
+----+------------+---------+---------+
|  1 | 2018-05-17 |       4 |       1 |
|  2 | 2018-05-17 |       4 |       2 |
|  3 | 2018-05-17 |       4 |       3 |
|  4 | 2018-05-17 |       4 |       2 |
|  5 | 2018-05-17 |       4 |       3 |
|  6 | 2018-05-17 |       4 |       1 |
|  7 | 2018-05-17 |       4 |       2 |
|  8 | 2018-05-17 |       4 |       3 |
+----+------------+---------+---------+
8 rows in set (0.00 sec)

MariaDB [test]> insert into amount_day(          
amount_day,          
APLAN,         
APLANcount,          
BPLAN,          
BPLANcount,      
CPLAN, 
CPLANcmount  ) 
select play_task.play_day, 
sum(case when play_task.plan_id = 1 then plan.main_time end ), 
count(play_task.plan_id = 1 or null ), 
sum(case when play_task.plan_id = 2 then plan.main_time end ), 
count(play_task.plan_id = 2 or null ), 
sum(case when play_task.plan_id = 3 then plan.main_time end ), 
count(play_task.plan_id = 3 or null ) 
from play_task left outer join plan on 
play_task.plan_id = plan.id   
group by play_day     
ON DUPLICATE KEY UPDATE      
APLAN = VALUES (APLAN) and      
APLANcount = values(APLANcount) and     
BPLAN = values(BPLAN) and     
BPLANcount = values(BPLANcount) and     
CPLAN = values(CPLAN) and     
CPLANcmount = values(CPLANcmount);
Query OK, 2 rows affected (0.00 sec)
Records: 1  Duplicates: 1  Warnings: 0

MariaDB [test]> select * from amount_day;
+----+------------+-------+------------+-------+------------+-------+-------------+
| id | amount_day | APLAN | APLANcount | BPLAN | BPLANcount | CPLAN | CPLANcmount |
+----+------------+-------+------------+-------+------------+-------+-------------+
|  1 | 2018-05-17 |     0 |          1 |    60 |          2 |    90 |           2 |
+----+------------+-------+------------+-------+------------+-------+-------------+
1 row in set (0.00 sec)


長々と読んでいただき本当にありがとうございます。

お手数ですが、よろしくお願いします。

追記create形式

MariaDB [test]> create table user(
    ->     id int unsigned not null auto_increment,
    ->     name varchar(50),
    ->     old int unsigned,
    ->     primary key (id)
    -> ) engine=InnoDB;
Query OK, 0 rows affected (0.11 sec)

MariaDB [test]> create table plan(
    ->     id int unsigned not null auto_increment,
    ->     name varchar(50),
    ->     main_time int unsigned,
    ->     primary key (id)
    -> ) engine=InnoDB;
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> create table play_task(
    ->     id int unsigned not null auto_increment,
    ->     play_day date,
    ->     user_id int unsigned ,
    ->     plan_id int unsigned ,
    ->     primary key (id),
    ->     foreign key(user_id) references user(id)
    ->     on update cascade on delete cascade ,
    ->     foreign key(plan_id) references plan(id)
    ->     on update cascade on delete cascade
    -> ) engine=InnoDB;
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> create table amount_day(
    ->     id int unsigned not null auto_increment,
    ->     amount_day date,
    ->     APLAN int unsigned ,
    ->     APLANcount int unsigned ,
    ->     BPLAN int unsigned ,
    ->     BPLANcount int unsigned ,
    ->     CPLAN int unsigned ,
    ->     CPLANcmount int unsigned ,
    ->     primary key (id)
    ->
    -> ) engine=InnoDB;
Query OK, 0 rows affected (0.01 sec)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

play_task.plan_id = 1 or null 

は何をしたいのでしょうか?

play_task.plan_id = 1 or play_task.plan_id is null 


ということですか?

 追記

insert into amount_day( amount_day,
APLAN,
APLANcount,
BPLAN,
BPLANcount,
CPLAN,
CPLANcount )
select
play_task.play_day,
sum((play_task.plan_id = 1)*plan.main_time) as s1,
sum(play_task.plan_id = 1) as c1,
sum((play_task.plan_id = 2)*plan.main_time) as s2,
sum(play_task.plan_id = 2) as c2,
sum((play_task.plan_id = 3)*plan.main_time) as s3,
sum(play_task.plan_id = 3) as c3
from play_task left join plan on
play_task.plan_id = plan.id
group by play_day
on duplicate key update
APLAN=values(APLAN),
APLANcount=values(APLANcount),
BPLAN=values(BPLAN),
BPLANcount=values(BPLANcount),
CPLAN=values(CPLAN),
CPLANcount=values(CPLANcount)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/18 20:06

    ご回答ありがとうございます。
    こちらの"or null"の記載がなかった場合、正しくカウント数が表示されないんですよ。。

    キャンセル

  • 2018/05/18 20:12

    tableの構成をcreate table形式で追記してもらえませんか?

    キャンセル

  • 2018/05/18 20:19

    ご連絡ありがとうございます。
    今更新いたしました。

    キャンセル

  • 2018/05/18 20:54

    on duplicateの構文が間違ってるっぽいですね

    キャンセル

  • 2018/05/18 21:30

    ちなみに適正なタグはMySQL→MariaDB

    キャンセル

  • 2018/05/19 08:39

    出来ました!!すごいです、本当に助かりました。
    ありがとうございます。

    >ちなみに適正なタグはMySQL→MariaDB
    次回から気を付けます、ご指摘ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    MariaDBで作成したtableにinsertが上手くできません。

    前提・実現したいこと データベースのテーブルにデータを登録したいです。 発生している問題・エラーメッセージ ERROR 1064 (42000): You have an

  • 解決済

    PHPでチェックボックスを複数チェックした場合のDBへの登録方法

    こんにちは。 PHPで、以下の通りチェックボックスの内容をDBに登録したいのですが、登録に失敗します。 MariaDB [fruit]> select * from f

  • 解決済

    ストアドプロシージャの書き方

    ストアドプロシージャにてテーブルのバックアップを行いたいのですが、その際にテーブル名に実行日時のマイナス1日を指定したいのですが、どのようにしたら良いのかわかりません。検索して調べ

  • 解決済

    MySQL トリガーについて

    MySQLトリガーについて トリガーという機能を知らなくて使ってみると便利! user1というテーブルで行った操作(INSERT/UPDATE/DELETE)を別テーブルに

  • 受付中

    ORDER BY RAND(); が遅い

     質問 タイトルの通りなのですが、 MariaDBにおいてORDER BY RAND()が非常に遅いため改善を試みましたが、 上手くいかなかった為、 「どうすれば結果取得ま

  • 解決済

    INの値が重複した時、複数行取得したい

    accounts テーブルは表1のようになっています。 表1. accountsテーブル id name 1 大塚 2 山田 3 斎藤

  • 解決済

    MySQLのテーブル作成について

    CREATE TABLE T_VendorShohin( F_ShohinName nvarchar(30) not null primary key, F_ShohinPrice

  • 解決済

    ユーザ定義変数に配列を代入したい

    前提・実現したいこと タイトルの通りですが、 ユーザー定義変数に配列(ベクトル)を代入したいのですが上手く出来ませんでした。 そもそも、スカラー値しか代入できないのでしょうか?

同じタグがついた質問を見る

  • MySQL

    5213questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。