2016-11-01 9 views
-1

MariaDB 10.1.18の制限付きクエリでオーダーを実行すると、間違ったオーダーに戻ります。MariaDB 10.1オーダーBy + Limit不一致

は、LIMIT文なしでクエリを守ってください。

select advert_id, published, id from vacancies order by published asc; 

+-----------+-----------+----+ 
| advert_id | published | id | 
+-----------+-----------+----+ 
| 328377 |   0 | 70 | 
| 328844 |   0 | 80 | 
| 325263 |   0 | 41 | 
| 325774 |   0 | 40 | 
| 325775 |   0 | 39 | 
| 325929 |   0 | 38 | 
| 325885 |   0 | 37 | 
| 325901 |   0 | 36 | 
| 325920 |   0 | 35 | 
| 325917 |   0 | 34 | 
| 325922 |   0 | 33 | 
| 325889 |   0 | 32 | 
| 325927 |   0 | 31 | 
| 325238 |   0 | 43 | 
| 325244 |   0 | 45 | 
| 328365 |   0 | 71 | 
| 328446 |   0 | 72 | 
| 328362 |   0 | 68 | 
| 323602 |   0 | 55 | 
| 324250 |   0 | 54 | 
| 324254 |   0 | 53 | 
| 324911 |   0 | 52 | 

LIMIT文で:

select advert_id, published, id from vacancies order by published asc limit 10; 

+-----------+-----------+----+ 
| advert_id | published | id | 
+-----------+-----------+----+ 
| 327830 |   0 | 1 | 
| 326865 |   0 | 18 | 
| 327328 |   0 | 9 | 
| 326877 |   0 | 16 | 
| 326783 |   0 | 21 | 
| 326779 |   0 | 17 | 
| 326774 |   0 | 15 | 
| 326864 |   0 | 20 | 
| 326788 |   0 | 14 | 
| 326767 |   0 | 19 | 
+-----------+-----------+----+ 

公表にすることによって順序が両方のクエリーで異なっています。

比較のため、私はMariaDB 5.5.50で同じクエリを実行し、+ limitによる順序が正しくクエリによる順序と同じ結果を返すことを発見しました。だから私が理解していることは、この問題はMariaDBに固有であり、新しいバージョンにのみ存在するということです。

さらに、私は同じクエリを実行しましたが、多くの異なる値を持つvarcharフィールドで順序付けを行いました。その場合、順序は正しいものでした。だから私は問題が同じ値をたくさん持つフィールドの制限付き注文にのみ適用されると思っています。

これを回避する方法があるかどうか分かりますか?おそらくMariaDBの設定ですか?

FYI:

表構造:

+------------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+------------------+------------------+------+-----+---------+----------------+ 
| id    | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| advert_id  | int(11)   | YES |  | NULL |    | 
| published  | tinyint(1)  | NO |  | 0  |    | 
| (other fields omitted) 

クエリに説明:問題のためで

explain select advert_id, published, id from vacancies order by published asc; 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 
| id | select_type | table  | type | possible_keys | key | key_len | ref | rows | Extra   | 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 
| 1 | SIMPLE  | vacancies | ALL | NULL   | NULL | NULL | NULL | 52 | Using filesort | 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 

explain select advert_id, published, id from vacancies order by published asc limit 10; 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 
| id | select_type | table  | type | possible_keys | key | key_len | ref | rows | Extra   | 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 
| 1 | SIMPLE  | vacancies | ALL | NULL   | NULL | NULL | NULL | 52 | Using filesort | 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 

バージョン:

mysql Ver 15.1 Distrib 10.1.18-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2 

バージョンを発行することによって順序なし:

mysql Ver 15.1 Distrib 5.5.50-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2 
+1

をしかしpublished'は常に '0' –

+0

あなたは注文時に使用したい_all_列を指定する必要があります。 –

+0

@juergendはい、しかし、1のレコードがあります。問題は、MariaDBがページネーションで使用するこのランダムな順序を使用すると、いくつかのレコードが表示されないことです。 – Jones03

答えて

3

取得する最初の10行を指定しません。 published0と等しい多くの行があるので、MariaDBはそれらのいくつかを自由に選択できます。あなたが特定の順序トライしたい場合: `

SELECT advert_id, published, id FROM vacancies ORDER BY published asc, id LIMIT 10; 
+0

ありがとう、それはトリックでした。しかし、MariaDB 5.5.50と10.1の間の相違点では、やや困惑しています。しかし、私は、第二引数が指定されない限り、保証がないと仮定すべきだと思います。 – Jones03