Description:
While using order by with limit, select gives incorrect result.
mysql> show create table test \G
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`city` varchar(10) DEFAULT NULL,
`dept_id` int(11) DEFAULT NULL,
`role` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `role_dept_id` (`role`,`dept_id`)
) ENGINE=InnoDB AUTO_INCREMENT=155 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql>
mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city;
+-----+-----------+-----------+
| id | name | city |
+-----+-----------+-----------+
| 141 | neel | pune |
| 125 | neel | pune |
| 122 | neel | pune |
| 133 | neel | pune |
| 87 | neel | pune |
| 129 | neel | pune |
| 83 | neel | pune |
| 137 | neel | pune |
| 79 | neel | pune |
| 75 | neel | pune |
| 140 | nilnandan | ahmedabad |
| 132 | nilnandan | ahmedabad |
| 136 | nilnandan | ahmedabad |
| 128 | nilnandan | ahmedabad |
| 124 | nilnandan | ahmedabad |
| 121 | nilnandan | ahmedabad |
| 86 | nilnandan | ahmedabad |
| 82 | nilnandan | ahmedabad |
| 78 | nilnandan | ahmedabad |
| 74 | nilnandan | ahmedabad |
+-----+-----------+-----------+
20 rows in set (0.00 sec)
mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 0,8;
+-----+------+------+
| id | name | city |
+-----+------+------+
| 122 | neel | pune |
| 75 | neel | pune |
| 133 | neel | pune |
| 79 | neel | pune |
| 125 | neel | pune |
| 83 | neel | pune |
| 141 | neel | pune |
| 87 | neel | pune |
+-----+------+------+
8 rows in set (0.00 sec)
mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 8,8;
+-----+-----------+-----------+
| id | name | city |
+-----+-----------+-----------+
| 133 | neel | pune |
| 75 | neel | pune |
| 128 | nilnandan | ahmedabad |
| 132 | nilnandan | ahmedabad |
| 124 | nilnandan | ahmedabad |
| 121 | nilnandan | ahmedabad |
| 86 | nilnandan | ahmedabad |
| 78 | nilnandan | ahmedabad |
+-----+-----------+-----------+
8 rows in set (0.01 sec)
mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 16,8;
+----+-----------+-----------+
| id | name | city |
+----+-----------+-----------+
| 86 | nilnandan | ahmedabad |
| 82 | nilnandan | ahmedabad |
| 78 | nilnandan | ahmedabad |
| 74 | nilnandan | ahmedabad |
+----+-----------+-----------+
4 rows in set (0.00 sec)
You can see that 'name' and 'city' are ordered seemingly randomly with different `limit`. More worse in this case is, ID 78 and 86 are appears in both limit 8,8 and limit 16,8
How to repeat:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`city` varchar(10) DEFAULT NULL,
`dept_id` int(11) DEFAULT NULL,
`role` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `role_dept_id` (`role`,`dept_id`)
) ENGINE=InnoDB
mysql> select * from test;
+-----+-----------+-----------+---------+---------+
| id | name | city | dept_id | role |
+-----+-----------+-----------+---------+---------+
| 74 | nilnandan | ahmedabad | 3 | manager |
| 75 | neel | pune | 3 | manager |
| 76 | ramesh | kerala | 0 | manager |
| 77 | muhammad | karachi | 0 | manager |
| 78 | nilnandan | ahmedabad | 3 | manager |
| 79 | neel | pune | 3 | manager |
| 80 | ramesh | kerala | 0 | manager |
| 81 | muhammad | karachi | 0 | manager |
| 82 | nilnandan | ahmedabad | 3 | manager |
| 83 | neel | pune | 3 | manager |
| 84 | ramesh | kerala | 0 | manager |
| 85 | muhammad | karachi | 0 | manager |
| 86 | nilnandan | ahmedabad | 3 | manager |
| 87 | neel | pune | 3 | manager |
| 88 | ramesh | kerala | 0 | manager |
| 89 | muhammad | karachi | 0 | manager |
| 121 | nilnandan | ahmedabad | 3 | manager |
| 122 | neel | pune | 3 | manager |
| 124 | nilnandan | ahmedabad | 3 | manager |
| 125 | neel | pune | 3 | manager |
| 126 | ramesh | kerala | 0 | manager |
| 127 | muhammad | karachi | 0 | manager |
| 128 | nilnandan | ahmedabad | 3 | manager |
| 129 | neel | pune | 3 | manager |
| 130 | ramesh | kerala | 0 | manager |
| 131 | muhammad | karachi | 0 | manager |
| 132 | nilnandan | ahmedabad | 3 | manager |
| 133 | neel | pune | 3 | manager |
| 134 | ramesh | kerala | 0 | manager |
| 135 | muhammad | karachi | 0 | manager |
| 136 | nilnandan | ahmedabad | 3 | manager |
| 137 | neel | pune | 3 | manager |
| 138 | ramesh | kerala | 0 | manager |
| 139 | muhammad | karachi | 0 | manager |
| 140 | nilnandan | ahmedabad | 3 | manager |
| 141 | neel | pune | 3 | manager |
+-----+-----------+-----------+---------+---------+
36 rows in set (0.00 sec)
mysql>
mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city;
mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 0,8;
mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 8,8;
mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 16,8;
Description: While using order by with limit, select gives incorrect result. mysql> show create table test \G *************************** 1. row *************************** Table: test Create Table: CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) DEFAULT NULL, `city` varchar(10) DEFAULT NULL, `dept_id` int(11) DEFAULT NULL, `role` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `role_dept_id` (`role`,`dept_id`) ) ENGINE=InnoDB AUTO_INCREMENT=155 DEFAULT CHARSET=latin1 1 row in set (0.00 sec) mysql> mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city; +-----+-----------+-----------+ | id | name | city | +-----+-----------+-----------+ | 141 | neel | pune | | 125 | neel | pune | | 122 | neel | pune | | 133 | neel | pune | | 87 | neel | pune | | 129 | neel | pune | | 83 | neel | pune | | 137 | neel | pune | | 79 | neel | pune | | 75 | neel | pune | | 140 | nilnandan | ahmedabad | | 132 | nilnandan | ahmedabad | | 136 | nilnandan | ahmedabad | | 128 | nilnandan | ahmedabad | | 124 | nilnandan | ahmedabad | | 121 | nilnandan | ahmedabad | | 86 | nilnandan | ahmedabad | | 82 | nilnandan | ahmedabad | | 78 | nilnandan | ahmedabad | | 74 | nilnandan | ahmedabad | +-----+-----------+-----------+ 20 rows in set (0.00 sec) mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 0,8; +-----+------+------+ | id | name | city | +-----+------+------+ | 122 | neel | pune | | 75 | neel | pune | | 133 | neel | pune | | 79 | neel | pune | | 125 | neel | pune | | 83 | neel | pune | | 141 | neel | pune | | 87 | neel | pune | +-----+------+------+ 8 rows in set (0.00 sec) mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 8,8; +-----+-----------+-----------+ | id | name | city | +-----+-----------+-----------+ | 133 | neel | pune | | 75 | neel | pune | | 128 | nilnandan | ahmedabad | | 132 | nilnandan | ahmedabad | | 124 | nilnandan | ahmedabad | | 121 | nilnandan | ahmedabad | | 86 | nilnandan | ahmedabad | | 78 | nilnandan | ahmedabad | +-----+-----------+-----------+ 8 rows in set (0.01 sec) mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 16,8; +----+-----------+-----------+ | id | name | city | +----+-----------+-----------+ | 86 | nilnandan | ahmedabad | | 82 | nilnandan | ahmedabad | | 78 | nilnandan | ahmedabad | | 74 | nilnandan | ahmedabad | +----+-----------+-----------+ 4 rows in set (0.00 sec) You can see that 'name' and 'city' are ordered seemingly randomly with different `limit`. More worse in this case is, ID 78 and 86 are appears in both limit 8,8 and limit 16,8 How to repeat: CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) DEFAULT NULL, `city` varchar(10) DEFAULT NULL, `dept_id` int(11) DEFAULT NULL, `role` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `role_dept_id` (`role`,`dept_id`) ) ENGINE=InnoDB mysql> select * from test; +-----+-----------+-----------+---------+---------+ | id | name | city | dept_id | role | +-----+-----------+-----------+---------+---------+ | 74 | nilnandan | ahmedabad | 3 | manager | | 75 | neel | pune | 3 | manager | | 76 | ramesh | kerala | 0 | manager | | 77 | muhammad | karachi | 0 | manager | | 78 | nilnandan | ahmedabad | 3 | manager | | 79 | neel | pune | 3 | manager | | 80 | ramesh | kerala | 0 | manager | | 81 | muhammad | karachi | 0 | manager | | 82 | nilnandan | ahmedabad | 3 | manager | | 83 | neel | pune | 3 | manager | | 84 | ramesh | kerala | 0 | manager | | 85 | muhammad | karachi | 0 | manager | | 86 | nilnandan | ahmedabad | 3 | manager | | 87 | neel | pune | 3 | manager | | 88 | ramesh | kerala | 0 | manager | | 89 | muhammad | karachi | 0 | manager | | 121 | nilnandan | ahmedabad | 3 | manager | | 122 | neel | pune | 3 | manager | | 124 | nilnandan | ahmedabad | 3 | manager | | 125 | neel | pune | 3 | manager | | 126 | ramesh | kerala | 0 | manager | | 127 | muhammad | karachi | 0 | manager | | 128 | nilnandan | ahmedabad | 3 | manager | | 129 | neel | pune | 3 | manager | | 130 | ramesh | kerala | 0 | manager | | 131 | muhammad | karachi | 0 | manager | | 132 | nilnandan | ahmedabad | 3 | manager | | 133 | neel | pune | 3 | manager | | 134 | ramesh | kerala | 0 | manager | | 135 | muhammad | karachi | 0 | manager | | 136 | nilnandan | ahmedabad | 3 | manager | | 137 | neel | pune | 3 | manager | | 138 | ramesh | kerala | 0 | manager | | 139 | muhammad | karachi | 0 | manager | | 140 | nilnandan | ahmedabad | 3 | manager | | 141 | neel | pune | 3 | manager | +-----+-----------+-----------+---------+---------+ 36 rows in set (0.00 sec) mysql> mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city; mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 0,8; mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 8,8; mysql> SELECT id, name, city FROM test WHERE dept_id = 3 AND role = 'manager' ORDER BY name, city limit 16,8;