Diberikan data akses situs web dalam formulir session_id, ip, user_agent
, dan cap waktu opsional, mengikuti kondisi di bawah ini, bagaimana cara terbaik Anda mengelompokkan sesi menjadi pengunjung unik?
session_id
: adalah id yang diberikan kepada setiap pengunjung baru. Itu tidak kedaluwarsa, namun jika pengguna tidak menerima cookie / menghapus cookie / perubahan browser / perubahan perangkat, ia tidak akan dikenali lagi
IP
dapat dibagikan di antara pengguna yang berbeda (Bayangkan kafe wi-fi gratis, atau ISP Anda yang mengatur ulang IP), dan mereka akan sering memiliki setidaknya 2, rumah dan kantor.
User_agent
adalah versi browser + OS, memungkinkan untuk membedakan antara perangkat. Misalnya, pengguna cenderung menggunakan ponsel dan laptop, tetapi tidak mungkin menggunakan laptop windows + apple. Tidak mungkin id sesi yang sama memiliki beberapa agen pengguna.
Data mungkin terlihat seperti biola di sini: http://sqlfiddle.com/#!2/c4de40/1
Tentu saja, kita berbicara tentang asumsi, tetapi tentang mendapatkan sedekat mungkin dengan kenyataan. Misalnya, jika kita menemukan ip dan agen yang sama dalam kerangka waktu terbatas dengan session_id yang berbeda, itu akan menjadi asumsi yang adil bahwa itu adalah pengguna yang sama, dengan beberapa pengecualian kasus tepi.
Sunting: Bahasa di mana masalah diselesaikan adalah tidak sopan, sebagian besar tentang logika dan bukan implementasi. Kodesemu baik-baik saja.
Sunting: karena sifat biola yang lambat, Anda dapat membaca / menjalankan mysql sebagai alternatif:
select session_id, floor(rand()*256*256*256*256) as ip_num , floor(rand()*1000) as user_agent_id
from
(select 1+a.nr+10*b.nr as session_id, ceil(rand()*3) as nr
from
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)a
join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)b
order by 1
)d
inner join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 )e
on d.nr>=e.nr