回答編集履歴

1

回答を追記

2016/12/15 09:16

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

test CHANGED
@@ -157,3 +157,157 @@
157
157
  [https://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL](https://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL)
158
158
 
159
159
  > Though MySQL does not support common table expressions there exists a demonstration of WITH RECURSIVE emulation[17] using stored procedures.
160
+
161
+
162
+
163
+ # 以下追記
164
+
165
+
166
+
167
+ > 「obj」カラムと「sort」カラム、この2つを合わせてユニークキーになる
168
+
169
+
170
+
171
+ であれば、そのようにユニークインデックスを作成してやればよいです。
172
+
173
+ で、SELECT, UPDATE, INSERT する際にも obj カラムの値を指定してやれば、単一テーブルで実現できます。
174
+
175
+ ```sql
176
+
177
+ mysql> CREATE TABLE test (
178
+
179
+ -> id int PRIMARY KEY AUTO_INCREMENT,
180
+
181
+ -> text text,
182
+
183
+ -> created DATE,
184
+
185
+ -> obj int NOT NULL,
186
+
187
+ -> sort int NOT NULL,
188
+
189
+ -> UNIQUE KEY (obj, sort)
190
+
191
+ -> );
192
+
193
+ Query OK, 0 rows affected (0.04 sec)
194
+
195
+
196
+
197
+ mysql> INSERT INTO test (text, created, obj, sort) VALUES
198
+
199
+ -> ('こんにちは', '2016-12-11', 1, 1),
200
+
201
+ -> ('私の名前は太郎です', '2016-12-12', 1, 2),
202
+
203
+ -> ('どうぞよろしくお願いします。', '2016-12-13', 1, 3),
204
+
205
+ -> ('こんばんは', '2016-12-11', 2, 1),
206
+
207
+ -> ('私の名前は花子です', '2016-12-12', 2, 2),
208
+
209
+ -> ('どうぞよろしくお願いします。', '2016-12-13', 2, 3);
210
+
211
+ Query OK, 6 rows affected (0.01 sec)
212
+
213
+ Records: 6 Duplicates: 0 Warnings: 0
214
+
215
+
216
+
217
+ mysql> SELECT * FROM test ORDER BY obj, sort;
218
+
219
+ +----+--------------------------------------------+------------+-----+------+
220
+
221
+ | id | text | created | obj | sort |
222
+
223
+ +----+--------------------------------------------+------------+-----+------+
224
+
225
+ | 1 | こんにちは | 2016-12-11 | 1 | 1 |
226
+
227
+ | 2 | 私の名前は太郎です | 2016-12-12 | 1 | 2 |
228
+
229
+ | 3 | どうぞよろしくお願いします。 | 2016-12-13 | 1 | 3 |
230
+
231
+ | 4 | こんばんは | 2016-12-11 | 2 | 1 |
232
+
233
+ | 5 | 私の名前は花子です | 2016-12-12 | 2 | 2 |
234
+
235
+ | 6 | どうぞよろしくお願いします。 | 2016-12-13 | 2 | 3 |
236
+
237
+ +----+--------------------------------------------+------------+-----+------+
238
+
239
+ 6 rows in set (0.00 sec)
240
+
241
+
242
+
243
+ mysql> BEGIN;
244
+
245
+ Query OK, 0 rows affected (0.00 sec)
246
+
247
+
248
+
249
+ mysql> SELECT sort FROM test WHERE obj = 1 AND text = '私の名前は太郎です' FOR UPDATE;
250
+
251
+ +------+
252
+
253
+ | sort |
254
+
255
+ +------+
256
+
257
+ | 2 |
258
+
259
+ +------+
260
+
261
+ 1 row in set (0.01 sec)
262
+
263
+
264
+
265
+ mysql> UPDATE test SET sort = sort + 1 WHERE obj = 1 AND sort >= 2 ORDER BY sort DESC;
266
+
267
+ Query OK, 2 rows affected (0.02 sec)
268
+
269
+ Rows matched: 2 Changed: 2 Warnings: 0
270
+
271
+
272
+
273
+ mysql> INSERT INTO test (text, created, obj, sort) VALUES
274
+
275
+ -> ('はじめまして', '2016-12-13', 1, 2);
276
+
277
+ Query OK, 1 row affected (0.00 sec)
278
+
279
+
280
+
281
+ mysql> COMMIT;
282
+
283
+ Query OK, 0 rows affected (0.01 sec)
284
+
285
+
286
+
287
+ mysql> SELECT * FROM test ORDER BY obj, sort;
288
+
289
+ +----+--------------------------------------------+------------+-----+------+
290
+
291
+ | id | text | created | obj | sort |
292
+
293
+ +----+--------------------------------------------+------------+-----+------+
294
+
295
+ | 1 | こんにちは | 2016-12-11 | 1 | 1 |
296
+
297
+ | 7 | はじめまして | 2016-12-13 | 1 | 2 |
298
+
299
+ | 2 | 私の名前は太郎です | 2016-12-12 | 1 | 3 |
300
+
301
+ | 3 | どうぞよろしくお願いします。 | 2016-12-13 | 1 | 4 |
302
+
303
+ | 4 | こんばんは | 2016-12-11 | 2 | 1 |
304
+
305
+ | 5 | 私の名前は花子です | 2016-12-12 | 2 | 2 |
306
+
307
+ | 6 | どうぞよろしくお願いします。 | 2016-12-13 | 2 | 3 |
308
+
309
+ +----+--------------------------------------------+------------+-----+------+
310
+
311
+ 7 rows in set (0.00 sec)
312
+
313
+ ```