diff --git a/mysql-test/r/order_by.result b/mysql-test/r/order_by.result
index 6744ffa889fe5d64d6e2989da606135f7abb66de..5674fbb9177030b3c5dc91687b73b619bc93684e 100644
--- a/mysql-test/r/order_by.result
+++ b/mysql-test/r/order_by.result
@@ -740,3 +740,41 @@ a	b
 1	2
 1	1
 drop table t1;
+create table t1 (
+`sid` decimal(8,0) default null,
+`wnid` varchar(11) not null default '',
+key `wnid14` (`wnid`(4)),
+key `wnid` (`wnid`)
+) engine=myisam default charset=latin1;
+insert into t1 (`sid`, `wnid`) values
+('10100','01019000000'),('37986','01019000000'),('37987','01019010000'),
+('39560','01019090000'),('37989','01019000000'),('37990','01019011000'),
+('37991','01019011000'),('37992','01019019000'),('37993','01019030000'),
+('37994','01019090000'),('475','02070000000'),('25253','02071100000'),
+('25255','02071100000'),('25256','02071110000'),('25258','02071130000'),
+('25259','02071190000'),('25260','02071200000'),('25261','02071210000'),
+('25262','02071290000'),('25263','02071300000'),('25264','02071310000'),
+('25265','02071310000'),('25266','02071320000'),('25267','02071320000'),
+('25269','02071330000'),('25270','02071340000'),('25271','02071350000'),
+('25272','02071360000'),('25273','02071370000'),('25281','02071391000'),
+('25282','02071391000'),('25283','02071399000'),('25284','02071400000'),
+('25285','02071410000'),('25286','02071410000'),('25287','02071420000'),
+('25288','02071420000'),('25291','02071430000'),('25290','02071440000'),
+('25292','02071450000'),('25293','02071460000'),('25294','02071470000'),
+('25295','02071491000'),('25296','02071491000'),('25297','02071499000');
+explain select * from t1 where wnid like '0101%' order by wnid;
+id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
+1	SIMPLE	t1	range	wnid14,wnid	wnid	13	NULL	10	Using where
+select * from t1 where wnid like '0101%' order by wnid;
+sid	wnid
+10100	01019000000
+37986	01019000000
+37989	01019000000
+37987	01019010000
+37990	01019011000
+37991	01019011000
+37992	01019019000
+37993	01019030000
+39560	01019090000
+37994	01019090000
+drop table t1;
diff --git a/mysql-test/t/order_by.test b/mysql-test/t/order_by.test
index dd36cd95969537aa84fb2f4f8feb31c7b60b6974..02e49f9750d73c0e41cb93168b87b6b057043449 100644
--- a/mysql-test/t/order_by.test
+++ b/mysql-test/t/order_by.test
@@ -506,3 +506,36 @@ insert t1 values (1,1,1),(1,1,2),(1,2,1);
 select a, b from t1 group by a, b order by sum(c);
 drop table t1;
 
+#
+# Bug #7331
+#
+
+create table t1 (
+  `sid` decimal(8,0) default null,
+  `wnid` varchar(11) not null default '',
+  key `wnid14` (`wnid`(4)),
+  key `wnid` (`wnid`)
+) engine=myisam default charset=latin1;
+
+insert into t1 (`sid`, `wnid`) values
+('10100','01019000000'),('37986','01019000000'),('37987','01019010000'),
+('39560','01019090000'),('37989','01019000000'),('37990','01019011000'),
+('37991','01019011000'),('37992','01019019000'),('37993','01019030000'),
+('37994','01019090000'),('475','02070000000'),('25253','02071100000'),
+('25255','02071100000'),('25256','02071110000'),('25258','02071130000'),
+('25259','02071190000'),('25260','02071200000'),('25261','02071210000'),
+('25262','02071290000'),('25263','02071300000'),('25264','02071310000'),
+('25265','02071310000'),('25266','02071320000'),('25267','02071320000'),
+('25269','02071330000'),('25270','02071340000'),('25271','02071350000'),
+('25272','02071360000'),('25273','02071370000'),('25281','02071391000'),
+('25282','02071391000'),('25283','02071399000'),('25284','02071400000'),
+('25285','02071410000'),('25286','02071410000'),('25287','02071420000'),
+('25288','02071420000'),('25291','02071430000'),('25290','02071440000'),
+('25292','02071450000'),('25293','02071460000'),('25294','02071470000'),
+('25295','02071491000'),('25296','02071491000'),('25297','02071499000');
+
+explain select * from t1 where wnid like '0101%' order by wnid;
+
+select * from t1 where wnid like '0101%' order by wnid;
+
+drop table t1;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 0273334eca2b5b46271fc1ac354165692c7368e3..cf02d1c4f6ee05497c976d75d9b824a6a0ee5640 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -10426,13 +10426,22 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
 	}
 	else
 	{
-          select->quick->head->file->ha_index_end();
-          /* 
-            We have verified above that select->quick is not 
-            index_merge quick select. 
-          */
-	  select->quick->index= new_ref_key;
-	  select->quick->init();
+          /*
+            The range optimizer constructed QUICK_RANGE for ref_key, and
+            we want to use instead new_ref_key as the index. We can't
+            just change the index of the quick select, because this may
+            result in an incosistent QUICK_SELECT object. Below we
+            create a new QUICK_SELECT from scratch so that all its
+            parameres are set correctly by the range optimizer.
+           */
+          key_map new_ref_key_map;
+          new_ref_key_map.clear_all();  /* Force the creation of quick select */
+          new_ref_key_map.set_bit(new_ref_key); /* only for new_ref_key.      */
+
+          if (select->test_quick_select(tab->join->thd, new_ref_key_map, 0,
+                                        (tab->join->select_options & OPTION_FOUND_ROWS) ?
+                                        HA_POS_ERROR : tab->join->unit->select_limit_cnt) <= 0)
+            DBUG_RETURN(0);
 	}
 	ref_key= new_ref_key;
       }