MariaDBで値が同じレコードをorder byしてlimitを指定するとlimit値によって取得出来るデータが変わる
MariaDBのバージョン
mysql Ver 15.1 Distrib 10.0.10-MariaDB, for Linux (x86_64) using readline 5.1
MariaDB [test]> desc test_table; +------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | test_id | int(11) | YES | | NULL | | | created_at | datetime | YES | | NULL | | +------------+----------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
こんなテーブルがあって
MariaDB [test]> select * from test_table; +----+---------+---------------------+ | id | test_id | created_at | +----+---------+---------------------+ | 2 | 555 | 2014-05-02 12:34:56 | | 4 | 333 | 2014-05-02 12:34:56 | | 6 | 111 | 2014-05-02 12:34:56 | | 8 | 444 | 2014-05-02 12:34:56 | | 10 | 222 | 2014-05-02 12:34:56 | +----+---------+---------------------+ 5 rows in set (0.00 sec)
バッチ処理とかで入れたら大体こんな感じにcreated_atが一緒なレコードが登録されます
で、created_atをorder byして、limitを1から順に増やしてみます
MariaDB [test]> select * from test_table order by created_at limit 1; +----+---------+---------------------+ | id | test_id | created_at | +----+---------+---------------------+ | 10 | 222 | 2014-05-02 12:34:56 | +----+---------+---------------------+ 1 row in set (0.00 sec)
!?
MariaDB [test]> select * from test_table order by created_at limit 2; +----+---------+---------------------+ | id | test_id | created_at | +----+---------+---------------------+ | 10 | 222 | 2014-05-02 12:34:56 | | 4 | 333 | 2014-05-02 12:34:56 | +----+---------+---------------------+ 2 rows in set (0.01 sec)
ワッザ!?
MariaDB [test]> select * from test_table order by created_at limit 3; +----+---------+---------------------+ | id | test_id | created_at | +----+---------+---------------------+ | 10 | 222 | 2014-05-02 12:34:56 | | 4 | 333 | 2014-05-02 12:34:56 | | 6 | 111 | 2014-05-02 12:34:56 | +----+---------+---------------------+ 3 rows in set (0.01 sec)
これはなにでソートされた順なんでしょう・・・?
MariaDB [test]> select * from test_table order by created_at limit 4; +----+---------+---------------------+ | id | test_id | created_at | +----+---------+---------------------+ | 2 | 555 | 2014-05-02 12:34:56 | | 4 | 333 | 2014-05-02 12:34:56 | | 6 | 111 | 2014-05-02 12:34:56 | | 8 | 444 | 2014-05-02 12:34:56 | +----+---------+---------------------+ 4 rows in set (0.00 sec)
指定してない時と同じになった
MariaDB [test]> select * from test_table order by created_at limit 5; +----+---------+---------------------+ | id | test_id | created_at | +----+---------+---------------------+ | 2 | 555 | 2014-05-02 12:34:56 | | 4 | 333 | 2014-05-02 12:34:56 | | 6 | 111 | 2014-05-02 12:34:56 | | 8 | 444 | 2014-05-02 12:34:56 | | 10 | 222 | 2014-05-02 12:34:56 | +----+---------+---------------------+ 5 rows in set (0.00 sec)
これもlimit 4の時と変わらず。
ちなみにMysqlだとこの現象は起きませんでした。
MariaDBで同じテーブルを違うlimitで取得するときは注意ですね。
既知のバグかもしれないですがMariaDBのバグ管理ページは当然全部英語なので分からないという・・・。
プログラマに英語必須ですね。。。