Q&A
現状について
現在、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`;
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(11) | NO | PRI | NULL | auto_increment |
contents_no | varchar(10) | NO | NULL | ||
page_no | smallint(5) | NO | NULL | ||
day | varchar(2) | NO | NULL | ||
hour | varchar(2) | NO | NULL | ||
created | timestamp | NO | CURRENT_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 ;
id | contents_no | page_no | day | hour | created |
---|---|---|---|---|---|
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 |
やりたいこと
上記条件で抽出したレコードについて、以下の条件で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;
id | contents_no | page_no | day | hour | created |
---|---|---|---|---|---|
2840638 | 22011 | 1 | 20 | 23 | 2022-09-20 23:59:59 |
2840641 | 22011 | 1 | 21 | 00 | 2022-09-21 00:00:00 |
2840642 | 22011 | 2 | 20 | 23 | 2022-09-20 23:59:59 |
2840643 | 22011 | 2 | 21 | 00 | 2022-09-21 00:00:00 |
2840644 | 22011 | 3 | 20 | 23 | 2022-09-20 23:59:59 |
2840645 | 22011 | 3 | 21 | 00 | 2022-09-21 00:00:00 |
2840646 | 22011 | 4 | 20 | 23 | 2022-09-20 23:59:59 |
2840648 | 22011 | 4 | 21 | 00 | 2022-09-21 00:00:00 |
2840649 | 22011 | 5 | 20 | 23 | 2022-09-20 23:59:59 |
2840650 | 22011 | 5 | 21 | 00 | 2022-09-21 00:00:00 |
2840651 | 22011 | 6 | 20 | 23 | 2022-09-20 23:59:59 |
2840652 | 22011 | 6 | 21 | 00 | 2022-09-21 00:00:00 |
2840653 | 22011 | 7 | 20 | 23 | 2022-09-20 23:59:59 |
2840654 | 22011 | 7 | 21 | 00 | 2022-09-21 00:00:00 |
今までは、phpMyAdminから上記のSELECT句で抽出したものを、
目視でイチイチ手動で書き変えていましたが、
今回は対象行が200行近くあり、手動でやるのは骨が折れます。
作業効率を改善すべく、時々一括UPDATEできるクエリを模索していましたが、
良い書き方が思いつかないです。。
CASE句を使って、SELECT句の抽出結果を偶数行と奇数行を分ければ、
実現できそうな予感はしていますが…
何か、ドンピシャなクエリありませんか?
よろしくお願いします。
回答2件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/09/20 06:37
2022/09/20 06:48 編集
2022/09/20 10:02 編集
2022/09/20 10:23
2022/09/21 08:59