今天寫模糊查詢的時候,按照時間排序並進行分頁時,在mybatis的映射文件中有這樣一條sql語句
1 SELECT 2 <include refid="Base_Column_List"/> 3 FROM USER U 4 WHERE U.status != #{status,jdbcType=VARCHAR} 5 <if test="keyword != null and keyword != ''"> 6 AND 7 ( 8 U.NAME LIKE #{keyword,jdbcType=VARCHAR} 9 OR U.USERNAME LIKE #{keyword,jdbcType=VARCHAR} 10 ) 11 </if> 12 ORDER BY U.lastupdateddate DESC 13 LIMIT #{offsetNum},#{pageSize}
如果先排序後分頁的話就能得到想要的結果,但是反之
SELECT <include refid="Base_Column_List"/> FROM USER U WHERE U.status != #{status,jdbcType=VARCHAR} <if test="keyword != null and keyword != ''"> AND ( U.NAME LIKE #{keyword,jdbcType=VARCHAR} OR U.USERNAME LIKE #{keyword,jdbcType=VARCHAR} ) </if> LIMIT #{offsetNum},#{pageSize} ORDER BY U.lastupdateddate DESC
這樣的話就會報錯。SQL的執行順序是from where select。那我可不可以認為,在相同優先級的where條件下誰在前面誰會優先執行,而order是對查詢結果的排序,而limit則是對查詢結果的選擇性獲取;如果limit在前的話比較好的結果是對選擇性獲取之後的
結果再進行排序,能不能得到這樣的結果應該和order by的工作機制相關。根據以上的例子顯然只能先排序後做選擇性獲取結果。若博友能貼出官方文檔解釋,十分感謝~