題名の通りです。
update の際の where句の条件では 複数が該当するのですが、
limit 1 で 1件しか更新していません。
更新されたデータを取得したいのです。
###自分なりにしてみたこと
最終更新日時を記録したカラムを作って それが最も古いデータを select した。
→ 同じ時刻に update した人がいたらおかしくなる。
insert の last_insert_id(); にあたる方法みたいなのはないのでしょうか?
それとも update と select を1文にして 同時にする方法など...
お回答お待ちしております。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
既に「解決済み」となっていますが、、
ご想像の通り、SELECT ... FOR UPDATE 構文を使うことで、望む動作を実現できます。
(ただし、操作対象のテーブルのエンジンが InnoDB の場合に限ります)
https://dev.mysql.com/doc/refman/5.6/ja/innodb-locking-reads.html
具体的には、以下のように使用します。
sql
1mysql> CREATE TABLE test ( 2 -> id INT PRIMARY KEY AUTO_INCREMENT, 3 -> value INT 4 -> ); 5Query OK, 0 rows affected (0.07 sec) 6 7mysql> INSERT INTO test (value) VALUES (1), (2), (2), (4), (7); 8Query OK, 5 rows affected (0.00 sec) 9Records: 5 Duplicates: 0 Warnings: 0 10 11mysql> SELECT * FROM test; 12+----+-------+ 13| id | value | 14+----+-------+ 15| 1 | 1 | 16| 2 | 2 | 17| 3 | 2 | 18| 4 | 4 | 19| 5 | 7 | 20+----+-------+ 215 rows in set (0.00 sec) 22 23mysql> BEGIN; 24Query OK, 0 rows affected (0.00 sec) 25 26mysql> SELECT id FROM test WHERE value = 2 LIMIT 1 FOR UPDATE; 27+----+ 28| id | 29+----+ 30| 2 | 31+----+ 321 row in set (0.00 sec) 33 34 35#1 36# ここで、別のターミナルなどから testテーブルの id = 2 を含むレコードに対して 37# UPDATE/DELETE または SELECT ... FOR UPDATE 文を実行 38 39 40mysql> UPDATE test SET value = 10 WHERE id = 2; 41Query OK, 1 row affected (0.01 sec) 42Rows matched: 1 Changed: 1 Warnings: 0 43 44mysql> COMMIT; 45Query OK, 0 rows affected (0.00 sec) 46 47mysql> SELECT * FROM test; 48+----+-------+ 49| id | value | 50+----+-------+ 51| 1 | 1 | 52| 2 | 10 | 53| 3 | 2 | 54| 4 | 4 | 55| 5 | 7 | 56+----+-------+ 575 rows in set (0.00 sec)
上述の#1
部分で、別のターミナルなどから同じ MySQL にログインし、testテーブルの id = 2 を含むレコードに対して UPDATE/DELETE または SELECT ... FOR UPDATE 文を実行してみてください。
COMMITするまで、SQL文の実行がブロックされる(応答が返ってこない)ことが確認できると思います。
投稿2016/11/28 02:57
総合スコア4791
0
複数条件をlimitで処理しているならorder byしているはずですから
おなじorder byをかけてlimit 1でデータをとればよいのでは?
sample
timestampで管理
SQL
1create table tbl(id int not null primary key,val int ,ts timestamp); 2insert into tbl(id,val) values(1,100),(2,150),(3,300); 3update tbl set val=400 where id=2; 4select * from tbl order by ts desc limit 1;
投稿2016/11/25 11:59
編集2016/11/28 03:16総合スコア117740
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/28 03:23
2016/11/28 03:33 編集

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。