表test有三列(a,b,c),100萬條記錄。(a,b)上有唯一索引,現在要查詢對於每乙個a,b的值最大的那條記錄。有好幾種方法。
1. select * from (select * from test order by d desc) as t group by a;
速度最快的,但只有mysql可以用。
2. select t1.* from test t1 left join test t2 on t1.a = t2.a and t1.b < t2.b where t2.b is null; 因為用了聯接,查詢的行數比較多,所以比較慢。a的選擇率越低,速度越慢。
3. select * from test where (a,b) in (select a,max(b) from test group by a); 這個慢不是因為表掃瞄,而是因為對於test的每一行,select a,max(b) from test group by a都會做一遍,這個從profile的結果可以看出來,explain中select_type是dependent subquery應該是同樣的意思。
所以先建乙個臨時表可以提高速度,
select t1.* from test t1 , (select a,max(b) as b from test group by a) as t2 where t1.a = t2.a and t1.b = t2.b
這種方法,a的選擇性越高則越慢
4. select * from test t1 where not exists (select * from test t2 where t1.a = t2.a and t1.b < t2.b)
和2差不多
基於特定字段分組記錄
有一系列字典或例項,並且希望根據特定欄位的值 例如日期 對分組 group 的資料進行迭代。下面有乙個子項為字典的序列 list 假如要根據日期 date 進行分組迭代 rows from operator import itemgetter from itertools import groupb...
分組取最新記錄的SQL
經常遇到這樣的情況,要取得所有客戶的最新交易記錄,讀取 所有瀏覽者最後一次訪問時間。乙個客戶只讀取最新的一次記錄,相同,大部分的人首先想 到的就是排除所有記錄,相同的只取一條。用distint,但是distint只能取到乙個欄位的值。所以使用distint就不能讀取 出所有的情況。下面是一條正確的語...
分組取最新記錄的SQL
經常遇到這樣的情況,要取得所有客戶的最新交易記錄,讀取 所有瀏覽者最後一次訪問時間。乙個客戶只讀取最新的一次記錄,相同,大部分的人首先想到的就是排除所有記錄,相同的只取一條。用distint,但是distint只能取到乙個欄位的值。所以使用distint就不能讀取 出所有的情況。下面是一條正確的語句...