1. 程式人生 > >mysql order by limit 的一個坑

mysql order by limit 的一個坑

需求:一次對錶中單行的值進行計數排序

發現的問題: 對單個無索引的欄位進行排序後limit .發現當被排序欄位有相同值時並且在limit範圍內,取的值並不是正常排序後的值,也就是說,當排在第N行的資料可取key1、 key2 時 , 排序結果可能是key1,也可能是key2。

select * from cnt_table  order by cnt desc

想要的結果
這裡寫圖片描述

排序+ limit 結果 (排序鍵無索引)
按cnt取key_word分別前三結果:

select * from cnt_table  order by cnt desc limit 1
select * from
cnt_table order by cnt desc limit 1, 1 select * from cnt_table order by cnt desc limit 2, 1
            key_word    cnt
結果  :       333       1
              222       1
              333       1

If multiple rows have identical values in the ORDER BY columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other words, the sort order of those rows is nondeterministic with respect to the nonordered columns.
是說如果order by的列有相同的值時, mysql會隨機選取這些行,具體根據執行計劃有所不同。

解決: order by 的列中包含一個索引列
此處增加主鍵id為排序列

select * from cnt_table  order by cnt desc,id asc limit 1;
select * from cnt_table  order by cnt desc,id asc limit 1,1;
select * from cnt_table  order by cnt desc,id asc limit 2,1;

這裡寫圖片描述

完成

相關推薦

mysql order by limit一個

需求:一次對錶中單行的值進行計數排序 發現的問題: 對單個無索引的欄位進行排序後limit .發現當被排序欄位有相同值時並且在limit範圍內,取的值並不是正常排序後的值,也就是說,當排在第N行的資料可取key1、 key2 時 , 排序結果可能是key1,也

mysql order by limit 問題

name hsb 出現 .cn cnblogs test mit width 1-1 問題 不使用limit時 使用limit出現問題了: 原因是出現相同值 gaoxiong 解決辦法:使用多個字段排序,上述例子可以改成 select * from hsb_test or

mysql 5.6 order by Limit執行效率問題

今天研發的同事反饋一個sql執行140+s但是sql很簡單,也有索引,那麼問題出在哪裡呢? 經過排查發現,mysql中,order by limit 一起用的時候是有問題的不是我們常用的思路,下面舉例說明: select tid, productname, pic, m

mysql group by order by limit 1

SELECT course_id, MAX(id) mid, COUNT(id) FROM org_class WHERE course_id IN(1, 102) GROUP BY course_id

MySQL實驗 內連線優化order by+limit 以及新增索引再次改進

# MySQL實驗 內連線優化order by+limit 以及新增索引再次改進 在進行[子查詢優化雙引數limit](https://www.cnblogs.com/G-Aurora/p/13254473.html)時我萌生了測試更加符合實際生產需要的`ORDER BY + LIMIT`的想法,或許我們也

Mysql Order By 註入總結

lmap regexp 通過 img tab 引用 情況 man ide 前言 最近在做一些漏洞盒子後臺項目的總結,在盒子多期眾測項目中,發現註入類的漏洞占比較大。其中Order By註入型的漏洞也占挺大一部分比例,這類漏洞也是白帽子樂意提交的類型(獎金高、被過濾概率小)

mysql order by 多個字段

out jsb fonts gravity nts order by water size mar 下圖是只加了一個排序的結果: 可以看到,單一字段是沒問題的。如果加入c2呢?下圖是c2 可以發現,這裏的orderby是先按c1增序,然後對於按c1排好序以後的相同的元素

mysql ORDER BY,GROUP BY 和DISTINCT原理

如果 str reat 個數 需要 是我 如何 where子句 三種 前言 除了常規的Join語句之外,還有一類Query語句也是使用比較頻繁的,那就是ORDERBY,GROUP BY以及DISTINCT這三類查詢。考慮到這三類查詢都涉及到數據的排序等操作,所以我將他們放在

Mysql Order By 字符串排序,mysql 字符串order by

-s 解決方案 tro sign 如果 開始 itl 描述 star Mysql Order By 字符串排序,mysql 字符串order by ============================== ?Copyright 蕃薯耀 2017年9月30日 http

mysql order by多個字段

sel 字段排序 div 默認 sele strong spa 關鍵字 asc Mysql order by 多字段排序 mysql單個字段降序排序: select * from table order by id desc; mysql單個字段升序排序:

Mysql批量更新的一個-&allowMultiQueries=true允許批量更新

做了 沒有 前言 更新 配置 ont where 原來 mysq 前言 利用Mybatis批量更新或者批量插入,實際上即使Mybatis完美支持你的sql,你也得看看你操作的數據庫是否完全支持,而同事,最近就遇到這樣的一個坑! 問題

mysql order by 中文排序

【中文排序】mysql order by 中文排序 1. 在MySQL中,我們經常會對一個欄位進行排序查詢,但進行中文排序和查詢的時候,對漢字的排序和查詢結果往往都是錯誤的。 這種情況在MySQL的很多版本中都存在。 如果這個問題不解決,那麼MySQL將無法實際處理中文。 出現這個問題的原因

MySQL ORDER BY程式碼筆記

mysql> select * from testB; +----+-------+---------+------------+ | id | name | address | time | +----+-------+---------+------------+ | 1

mysql order by rand() 效率優化方法

                     mysql order by rand() 效率優化方法   轉載:https://blog.csdn.net/fdipzone/

mysql order by field 按指定欄位排序

舉個例子 a表裡有b欄位 b欄位裡有資料-1,1,2,3,4 如果想把4,2,3的排在最前面,其他的排在後面,並且保留4,2,3的順序 sql: select * from a order by FIELD(3,2,4) DESC 如果是這樣寫sql: s

mysql order by不起作用各種型別排序說明

當你有一天發現order by不起作用, 首先不要懷疑跟索引啊,主鍵啊,反正一堆亂七八糟的想法。 其實排序正常只有int型別才起作用 所以你只需要看一看排序的欄位型別就好 下面說說幾種排序 數字 型別:order by 欄位  排序方式 字串型別:order b

MySQL Order By 使用方法

在MySQL中的Order By 有2種排序實現方式 利用有序索引獲取有序資料 檔案排序 索引排序 取出滿足過濾條件、作為排序條件的欄位,以及可以直接定位到行資料的行指標資訊,在 Sort Buffer 中進行實際的排序操作,然後利用排好序的資料根據行指標資訊返回表中取

MySQL Order By實現原理分析和Filesort優化

. 目錄(?)[-] 在MySQL中的ORDER BY有兩種排序實現方式: 1、利用有序索引獲取有序資料 2、檔案排序 在使用explain分析查詢的時候,利用有序索引獲取有序資料顯示Using index。而檔案排序顯示Using filesort。 1.利

MYSQL order by 根據不同條件升序或降序

現在有一個表,欄位age和type,type = 1的時候需要age降序排列,type = 2的時候age升序排列。一開始覺得很簡單啊,於是就寫: SELECT * FROM table_a ORDER BY CASE WHEN type = 1 THEN

Mysql Order By注入總結

何為order by 注入 本文討論的內容指可控制的位置在order by子句後,如下order引數可控"select * from goods order by $_GET['order']" 簡單注入判斷 在早期注入大量存在的時候利用order by子句進行快速猜解列數,再配合union select語