2017-01-20 43 views
0

我想獲得最新的排爲此,我傳遞給IN子句DISTINCT給人重複的結果

每個MSISDN這是我的表結構

CREATE TABLE `cell_volume_details` (
    `id` int(12) NOT NULL AUTO_INCREMENT, 
    `date_time` bigint(20) DEFAULT NULL, 
    `cell_id` int(11) DEFAULT NULL, 
    `volume` bigint(20) DEFAULT NULL, 
    `dn` int(11) DEFAULT NULL, 
    `cg_key` varchar(5) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO CHARSET=latin1; 

這是我的查詢

SELECT DISTINCT dn, cell_id as cell, cg_key 
     FROM cell_volume_details WHERE dn IN  
     (55484522680, 55484522794, 55484522289, 
     55484522995, 55484522840, 55484522106, 
     55484522610) ORDER BY id DESC; 

這是結果

+-------------+-------+--------+ 
| dn   | cell | cg_key | 
+-------------+-------+--------+ 
| 55484522106 | 4181 | cg1 | 
| 55484522106 | 21183 | cg1 | 
| 55484522840 | 17369 | cg11 | 
| 55484522289 | 1222 | cg2 | 
| 55484522106 | 32181 | cg1 | 
| 55484522106 | 32183 | cg1 | 
| 55484522794 | 27363 | cg5 | 
| 55484522995 | 24219 | cg3 | 
| 55484522794 | 21368 | cg5 | 
| 55484522794 | 40367 | cg5 | 
| 55484522794 | 10367 | cg5 | 
| 55484522289 | 1229 | cg2 | 
| 55484522289 | 17228 | cg2 | 
| 55484522289 | 1227 | cg2 | 
| 55484522794 | 45368 | cg5 | 
| 55484522610 | 6018 | cg9 | 
| 55484522680 | 2373 | cg2 | 
| 55484522610 | 1158 | cg9 | 
| 55484522610 | 3151 | cg9 | 
| 55484522794 | 13369 | cg5 | 
| 55484522610 | 3153 | cg9 | 
| 55484522289 | 1228 | cg2 | 
| 55484522840 | 17369 | cg2 | 
| 55484522610 | 14163 | cg9 | 
| 55484522610 | 14169 | cg9 | 
| 55484522794 | 8361 | cg5 | 
| 55484522680 | 17373 | cg2 | 
| 55484522794 | 8362 | cg5 | 
| 55484522289 | 1225 | cg2 | 
| 55484522794 | 10368 | cg5 | 
| 55484522794 | 8367 | cg5 | 
| 55484522680 | 17371 | cg2 | 
| 55484522680 | 27362 | cg2 | 
| 55484522995 | 24217 | cg3 | 
| 55484522794 | 43369 | cg5 | 
| 55484522794 | 10365 | cg5 | 
| 55484522840 | 17369 | cg13 | 
| 55484522610 | 1152 | cg9 | 
| 55484522794 | 8368 | cg5 | 
| 55484522995 | 24218 | cg3 | 
+-----------+-------+--------+ 

我找不到有什麼問題,我在桌上有8千萬條記錄,當我做GROUP BY時,記錄變得非常慢,任何人都請幫助我

+1

你需要一個'GROUP BY'選擇具有最大(ID)組的行。 – fedorqui

+0

我在表中有80萬條記錄,當我做GROUP BY時,它變得非常慢 – Muhunthan

+1

Distinct子句覆蓋所有選定的列 - 輸出如預期 - 您需要更改查詢以查找max(id)對於每個dn –

回答

1
select * 
from 
(
select s.*, 
     if(s.dn <> @p,@rn:=1,@rn:[email protected]+1) rn, 
     @p:=s.dn 
from 
(
SELECT id,dn, cell_id as cell, cg_key 
FROM cell_volume_details 
WHERE dn IN  
      (55484522680, 55484522794, 55484522289, 
     55484522995, 55484522840, 55484522106, 
     55484522610) 
) s 
, (select @rn:=0 ,@p:=0) rn 
order by s.dn,s.id desc 
) t 
where t.rn = 1 
1

如果你想讓dn的最後一行你應該通過cell_volume_details

select dn, cell_id as cell, cg_key 
FROM cell_volume_details 
where id in (
     select max(id) from cell_volume_details WHERE dn IN  
     (55484522680, 55484522794, 55484522289, 
     55484522995, 55484522840, 55484522106, 
     55484522610) 
) 
+0

這將只返回1條記錄。你仍然需要在你的嵌套查詢中使用group by – Johan

+0

@Johan這應該返回子查詢中in子句中每個dn的最後一條記錄..並且沒有聚合函數,那麼不需要group by。 – scaisEdge

+0

您的子選擇只返回1條記錄。 – Johan