Error-based
將聚合函數count()和group by語句聯合起來迫使sql查詢語句返回錯誤
須知:
floor:函數只返回整數部分,小數部分舍棄。
round:函數四舍五入,大於0.5的部分進位,不到則舍棄。
floor(rand(0)*2)前面產生的隨機數是確定的011011...
1>mysql在遇到select count(*) from tables group by x;這語句的時候會建立一個虛擬表
(其中key是主鍵,不可重復)
2>取第一條數據,執行floor(rand(0)*2),發現結果為0(第一次計算),查詢虛擬表,發現0的鍵值不存在,則floor(rand(0)*2)會被再計算一次,結果為1(第二次計算),插入虛表,第二次計算是計算鍵值(主鍵)
查詢第二條記錄,再次計算floor(rand(0)*2),發現結果為1(第三次計算),查詢虛表,發現1的鍵值存在,所以floor(rand(0)*2)不會被計算第二次,直接count(*)加1
查詢第三條記錄,再次計算floor(rand(0)*2),發現結果為0(第4次計算),查詢虛表,發現鍵值沒有0,進行第二次鍵值得計算,結果為1,因為主鍵不可重復,所以報錯([Err] 1062 - Duplicate entry ‘1‘ for key ‘group_key‘),所以至少要三條數據才可以,確定出錯
a>floor(rand()*2)產生的隨機數不確定,所以可能只需要兩條記錄就出錯了,如下
註意:如果是select count(*),floor(rand(0)*2) from user group by 2;可以看成select count(*) from user group by floor(rand(0)*2)
Error-based