Đưa ra dữ liệu truy cập trang web trong biểu mẫu session_id, ip, user_agent
và dấu thời gian tùy chọn, theo các điều kiện bên dưới, làm thế nào tốt nhất bạn có thể phân cụm các phiên thành khách truy cập duy nhất?
session_id
: là một id được cung cấp cho mọi khách truy cập mới. Nó không hết hạn, tuy nhiên nếu người dùng không chấp nhận cookie / xóa cookie / thay đổi trình duyệt / thay đổi thiết bị, anh ta sẽ không được nhận ra nữa
IP
có thể được chia sẻ giữa những người dùng khác nhau (Hãy tưởng tượng một quán cà phê wi-fi miễn phí hoặc IP gán lại ISP của bạn) và họ thường sẽ có ít nhất 2, tại nhà và nơi làm việc.
User_agent
là phiên bản trình duyệt + HĐH, cho phép phân biệt giữa các thiết bị. Ví dụ, người dùng có thể sử dụng cả điện thoại và máy tính xách tay, nhưng không thể sử dụng máy tính xách tay windows + apple. Không chắc là cùng một id phiên có nhiều người dùng.
Dữ liệu có thể trông giống như câu đố ở đây: http://sqlfiddle.com/#!2/c4de40/1
Tất nhiên, chúng ta đang nói về các giả định, nhưng đó là về việc càng gần với thực tế càng tốt. Ví dụ: nếu chúng ta gặp cùng một ip và useragent trong một khung thời gian giới hạn với một session_id khác, thì đó sẽ là một giả định hợp lý rằng đó là cùng một người dùng, với một số trường hợp ngoại lệ.
Chỉnh sửa: Ngôn ngữ giải quyết vấn đề không chính đáng, chủ yếu là về logic và không triển khai. Mã giả là tốt.
Chỉnh sửa: do tính chất chậm của fiddle, bạn có thể thay thế đọc / chạy mysql:
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