###前提
以下3つのテーブル構成です。
・スレッドp_threads
・コメントp_comments
・それらのスーパータイプp_matters
###現状と目的
p_comments
のorder_number
というカラムが現状では0
ですが、これを同一スレッドごとに順繰りにUPDATEしたいと思っています。
目的はこうで↓、order_number
が同一スレッドごと(thread_ID
ごと)に更新された状態です。
###ソースコード
上の現状を示すテーブルになります。
-- 投稿 (スーパータイプ) CREATE TABLE p_matters (`ID` int, `kind` int, `sentence` varchar(1000), `created_at` DATETIME(6)) ; INSERT INTO p_matters (`ID`, `kind`, `sentence`, `created_at`) VALUES # thread は kind=1 で comment は kind=2 (1, 1, '猫について語りましょう', '2020-01-01 12:00:00.123456'), (2, 1, '犬について語りましょう', '2020-01-02 12:00:00.123456'), (3, 2, '猫はいいです', '2020-01-03 12:00:00.123456'), (4, 2, 'たしかに猫は最高です', '2020-01-04 12:00:00.123456'), (5, 1, '鰐について語りましょう', '2020-01-05 12:00:00.123456'), (6, 2, '鰐は怖いです', '2020-01-06 12:00:00.123456'), (7, 2, '犬はやわらかいです', '2020-01-07 12:00:00.123456'), (8, 2, '猫は液体です', '2020-01-08 12:00:00.123456'), (9, 2, '猫は液体ではないです', '2020-01-09 12:00:00.123456'), (10, 2, '鰐は怖くないです', '2020-01-10 12:00:00.123456') ; -- 投稿 (サブタイプ/スレッド) CREATE TABLE p_threads (`matter_ID` int, `title` varchar(100)) ; INSERT INTO p_threads (`matter_ID`, `title`) VALUES (1, '猫スレ'), (2, '犬スレ'), (5, '鰐スレ') ; -- 投稿 (サブタイプ/コメント) CREATE TABLE p_comments (`matter_ID` int, `thread_ID` varchar(10), `order_number` int) ; INSERT INTO p_comments (`matter_ID`, `thread_ID`, `order_number`) VALUES (3, 1, 0),(4, 1, 0),(6, 5, 0),(7, 2, 0),(8, 1, 0),(9, 1, 0),(10, 5, 0) ;
###試したこと
SQLだけでできれば楽ですが、自分にできることと合わせて、
- SQLで取得
- PHPで編集
- SQLで更新
という流れで以下試してみました。
ですが同一スレッドであるにも拘わらず、同じorder_number
が保存されてしまっています。
var_dump($comments);
でスレッドごとにわかれていることを確認しているのに、なぜこのようなことになるのか理解できません。
保存処理はできているので$i
がおかしいのだと思いますが、何がいけないのでしょうか。
php
1// すべてのコメントを取得 2$sql = " 3SELECT * 4FROM p_matters matters 5LEFT JOIN p_comments comments ON comments.matter_ID=matters.ID 6WHERE matters.kind=2 AND matters.ID IS NOT NULL 7ORDER BY matters.created_at ASC 8"; 9$rows = $wpdb->get_results( $sql, ARRAY_A ); 10var_dump($rows); 11 12// created_at でソート 13foreach ( $rows as $key => $value ) { 14 $created_at[$key] = $value['created_at']; 15} 16array_multisort( $created_at, SORT_ASC, $rows ); 17var_dump($rows); 18 19// 同一スレッドごとに整理 20$comments = []; 21foreach ( $rows as $row ) { 22 $thread_ID = $row['thread_ID']; 23 $comments[$thread_ID][] = $row; 24} 25var_dump($comments); 26 27// コメントテーブルに order_number を入れていく 28foreach ( $comments as $thread_ID => $rows ) { 29 if( empty($thread_ID) ) continue; 30 31 $i = 1; 32 foreach ( $rows as $row ) { 33 $target = [ 'matter_ID' => $row['ID'] ]; 34 $update = [ 'order_number' => $i ]; 35 $row = $wpdb->update( 'p_comments', $update, $target, ['%d'], ['%d'] ); 36 $i++; 37 } 38} 39
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/02 09:48