請問一個關於PHP大數組去重的有關問題

來源:互聯網
上載者:User
請教一個關於PHP大數組去重的問題
請教一個問題,關於PHP大數組操作,一張表有幾百萬的資料要拿到PHP數組中做去重操作:
例如:id 性別 身份證三個欄位,需要統計男女各有多少人(有其它特定邏輯,不能在MySQL中去重)
實現方法:id是自增的,每次按id取5w條資料,拿到一個數組中做去重操作
$count = array(
'男' => array(
'身份證1' => 1,
'身份證2' => 1,
....
),
'女' => ...
);
最後看男女下共有多少個身份證即為去重後的資料
問題:隨著數組越來越大,去重速度也越來越慢,不知道有沒有其它解決方案或者最佳化方法,來請教一下,thx!
------解決思路----------------------
我們按你給出的資料做一個測試
drop table if exists play;

CREATE TABLE `play` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`time` int(10) NOT NULL,
`uid` int(10) unsigned NOT NULL,
`game` varchar(255) NOT NULL,
`channel` varchar(255) NOT NULL,
`system` varchar(255) NOT NULL,
`screen` varchar(255) NOT NULL,
`network` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `datetime` (`time`)
) charset=gbk;

insert into play values
(1,1421812389,10000,'所有遊戲-魔獸世界-0服','360-360聯盟','WIN7','1024x768','電信'),
(2,1421812389,10001,'所有遊戲-魔獸世界-1服','網易-網易聯盟','XP','1366x768','聯通'),
(3,1421812389,10000,'所有遊戲-魔獸世界-0服','360-360聯盟','WIN7','1024x768','電信');

drop table if exists play_game;

create table play_game ( game varchar(100) ) charset=gbk;

insert into play_game values ('所有遊戲'),('魔獸世界'),('0服'),('1服');

drop table if exists play_channel;

create table play_channel ( channel varchar(100) ) charset=gbk;

insert into play_channel values ('360'),('360聯盟'),('網易'),('網易聯盟');

select a.id, a.time, a.uid, b.game, c.channel, a.system, a.screen, a.network from play a, play_game b, play_channel c where
find_in_set(b.game, replace(a.game, '-', ','))
and
find_in_set(c.channel, replace(a.channel, '-', ','))
可得到這樣的結果

id time    uid  game   channel system screen  network
1 1421812389 10000 所有遊戲 360   WIN7  1024x768 電信
3 1421812389 10000 所有遊戲 360   WIN7  1024x768 電信
1 1421812389 10000 魔獸世界 360   WIN7  1024x768 電信
3 1421812389 10000 魔獸世界 360   WIN7  1024x768 電信
1 1421812389 10000 0服    360   WIN7  1024x768 電信
3 1421812389 10000 0服    360   WIN7  1024x768 電信
1 1421812389 10000 所有遊戲 360聯盟 WIN7  1024x768 電信
3 1421812389 10000 所有遊戲 360聯盟 WIN7  1024x768 電信
1 1421812389 10000 魔獸世界 360聯盟 WIN7  1024x768 電信
3 1421812389 10000 魔獸世界 360聯盟 WIN7  1024x768 電信
1 1421812389 10000 0服    360聯盟 WIN7  1024x768 電信
3 1421812389 10000 0服    360聯盟 WIN7  1024x768 電信
2 1421812389 10001 所有遊戲 網易   XP   1366x768 聯通
2 1421812389 10001 魔獸世界 網易   XP   1366x768 聯通
2 1421812389 10001 1服    網易   XP   1366x768 聯通
2 1421812389 10001 所有遊戲 網易聯盟 XP   1366x768 聯通
2 1421812389 10001 魔獸世界 網易聯盟 XP   1366x768 聯通
2 1421812389 10001 1服    網易聯盟 XP   1366x768 聯通

再從這個結果出發,還有什麼是不可用 SQL 做到的呢?

如果你永久性的將 所有遊戲-魔獸世界-0服 改為 所有遊戲,魔獸世界,0服 那就不需要在查詢時執行 replace 函數了(當然這可能會涉及程式的改動),效率自然會有所提高
如果你再將最後的查詢定義成視圖的話,效率就又會提高不少(視圖中如果一條記錄的來源資料沒有被改變,則不做查詢動作而直接返回緩衝的結果)

------解決思路----------------------
怎麼能把 所有遊戲-wow-1服 存在一個欄位裡呢~
我是建議添加幾個欄位,將它拆開儲存,然後在mysql上排重
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.