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

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

新規登録して質問してみよう
ただいま回答率
86.12%
MySQL

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

解決済

MySQLで、偶数件のレコードと奇数件のレコードで別々のUPDATE句を実行するにはどうすれば良いですか

qwe001
qwe001

総合スコア129

MySQL

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

2回答

0リアクション

0クリップ

305閲覧

投稿2022/09/20 05:28

編集2022/09/20 05:33

現状について

現在、DBに以下のようなレコードがあります。

CREATE TABLE `logs` ( `id` int(11) NOT NULL, `contents_no` varchar(10) NOT NULL, `page_no` smallint(5) NOT NULL, `day` varchar(2) NOT NULL, `hour` varchar(2) NOT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; DESC `logs`;
FieldTypeNullKeyDefaultExtra
idint(11)NOPRINULLauto_increment
contents_novarchar(10)NONULL
page_nosmallint(5)NONULL
dayvarchar(2)NONULL
hourvarchar(2)NONULL
createdtimestampNOCURRENT_TIMESTAMP
INSERT INTO `logs` (`id`, `contents_no`, `page_no`, `day`, `hour`, `created`) VALUES (2840638, '22011', 1, '20', '13', '2022-09-20 13:01:13'), (2840641, '22011', 1, '20', '13', '2022-09-20 13:02:22'), (2840642, '22011', 2, '20', '13', '2022-09-20 13:02:34'), (2840643, '22011', 2, '20', '13', '2022-09-20 13:05:48'), (2840644, '22011', 3, '20', '13', '2022-09-20 13:06:12'), (2840645, '22011', 3, '20', '13', '2022-09-20 13:11:22'), (2840646, '22011', 4, '20', '13', '2022-09-20 13:13:13'), (2840648, '22011', 4, '20', '13', '2022-09-20 13:15:53'), (2840649, '22011', 5, '20', '13', '2022-09-20 13:22:03'), (2840650, '22011', 5, '20', '13', '2022-09-20 13:35:51'), (2840651, '22011', 6, '20', '13', '2022-09-20 13:36:00'), (2840652, '22011', 6, '20', '13', '2022-09-20 13:38:49'), (2840653, '22011', 7, '20', '13', '2022-09-20 13:51:11'), (2840654, '22011', 7, '20', '13', '2022-09-20 13:59:59');
SELECT * FROM `logs` WHERE `contents_no` = '22011' AND `created` BETWEEN '2022-09-20 13:00:00' AND '2022-09-20 13:59:59' ORDER BY `created` ASC ;
idcontents_nopage_nodayhourcreated
284063822011120132022-09-20 13:01:13
284064122011120132022-09-20 13:02:22
284064222011220132022-09-20 13:02:34
284064322011220132022-09-20 13:05:48
284064422011320132022-09-20 13:06:12
284064522011320132022-09-20 13:11:22
284064622011420132022-09-20 13:13:13
284064822011420132022-09-20 13:15:53
284064922011520132022-09-20 13:22:03
284065022011520132022-09-20 13:35:51
284065122011620132022-09-20 13:36:00
284065222011620132022-09-20 13:38:49
284065322011720132022-09-20 13:51:11
284065422011720132022-09-20 13:59:59

やりたいこと

上記条件で抽出したレコードについて、以下の条件でUPDATEを実行したいです

  • page_no 毎に、1件目は created の値を その日の 23:59:59 に変更し、 hour の値を 23 に変更する
  • page_no 毎に、2件目は created の値を その日の 翌日の 00:00:00 に変更し、 hour の値を 00 に変更し、 day の値を 翌日に変更する
  • 【前提】抽出結果は page_no 毎に必ず2件になる。
    • 0~1件や、3件以上になることはない。
    • つまり、必ず2の倍数でレコードが抽出される。
  • 【備考】できれば、PHPなどのサーバーサイド処理を行わず、MySQL句のみでUPDATEが完結してると嬉しいです。

UPDATE後の例(現状のUPDATE句)

UPDATE `logs` SET `created` = '2022-09-20 23:59:59' AND `hour` = '23' WHERE `id` = 2840638; UPDATE `logs` SET `created` = '2022-09-21 00:00:00' AND `hour` = '00' AND `day` = '21' WHERE `id` = 2840641; ... UPDATE `logs` SET `created` = '2022-09-20 23:59:59' AND `hour` = '23' WHERE `id` = 2840653; UPDATE `logs` SET `created` = '2022-09-21 00:00:00' AND `hour` = '00' AND `day` = '21' WHERE `id` = 2840654;
idcontents_nopage_nodayhourcreated
284063822011120232022-09-20 23:59:59
284064122011121002022-09-21 00:00:00
284064222011220232022-09-20 23:59:59
284064322011221002022-09-21 00:00:00
284064422011320232022-09-20 23:59:59
284064522011321002022-09-21 00:00:00
284064622011420232022-09-20 23:59:59
284064822011421002022-09-21 00:00:00
284064922011520232022-09-20 23:59:59
284065022011521002022-09-21 00:00:00
284065122011620232022-09-20 23:59:59
284065222011621002022-09-21 00:00:00
284065322011720232022-09-20 23:59:59
284065422011721002022-09-21 00:00:00

今までは、phpMyAdminから上記のSELECT句で抽出したものを、
目視でイチイチ手動で書き変えていましたが、
今回は対象行が200行近くあり、手動でやるのは骨が折れます。

作業効率を改善すべく、時々一括UPDATEできるクエリを模索していましたが、
良い書き方が思いつかないです。。

CASE句を使って、SELECT句の抽出結果を偶数行と奇数行を分ければ、
実現できそうな予感はしていますが…

何か、ドンピシャなクエリありませんか?
よろしくお願いします。

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

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

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

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

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

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

MySQL

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