按浏览器对用户代理进行分组

问题描述 投票:0回答:5

我有一个表,每行包含有关用户加载的页面的数据。其中一个字段是该点击的用户代理。如何按浏览器对结果进行分组?我可以按常见的用户代理进行分组:

SELECT useragent, COUNT(useragent) AS c
FROM hitstable
GROUP BY useragent
ORDER BY c DESC

但我想按浏览器分组,无论版本或其他数据发生变化。我希望它输出一个列表,列出浏览器的常见程度。

我该怎么做?

mysql group-by user-agent
5个回答
4
投票

我发现使用 MySQL CASE 来解析浏览器、操作系统和位架构很有帮助。数据 ($_SERVER['HTTP_USER_AGENT']) 通过 PHP 插入到 MySQL 表中。也许您会发现以下代码很有帮助。它还根据 UserAgent 渲染一些 Font Awesome 图标。

下面的 SELECT 按浏览器别名分组。当然,对于操作系统和 BitArchitecture 也可以这样做。

SELECT 
    CASE
        WHEN `UserAgent` LIKE '%Mac%OS%' THEN '<i class="fa fa-apple"></i> Mac OS X'
        WHEN `UserAgent` LIKE '%iPad%' THEN '<i class="fa fa-apple"></i> iPad'
        WHEN `UserAgent` LIKE '%iPod%' THEN '<i class="fa fa-apple"></i> iPod'
        WHEN `UserAgent` LIKE '%iPhone%' THEN '<i class="fa fa-apple"></i> iPhone'
        WHEN `UserAgent` LIKE '%imac%' THEN '<i class="fa fa-apple"></i> mac'
        WHEN `UserAgent` LIKE '%android%' THEN '<i class="fa fa-android"></i> android'
        WHEN `UserAgent` LIKE '%linux%' THEN '<i class="fa fa-linux"></i> linux'
        WHEN `UserAgent` LIKE '%Nokia%' THEN 'Nokia'
        WHEN `UserAgent` LIKE '%BlackBerry%' THEN 'BlackBerry'
        WHEN `UserAgent` LIKE '%win%' THEN
            CASE
                WHEN `UserAgent` LIKE '%NT 6.2%' THEN '<i class="fa fa-windows"></i> Windows 8'
                WHEN `UserAgent` LIKE '%NT 6.3%' THEN '<i class="fa fa-windows"></i> Windows 8.1'
                WHEN `UserAgent` LIKE '%NT 6.1%' THEN '<i class="fa fa-windows"></i> Windows 7'
                WHEN `UserAgent` LIKE '%NT 6.0%' THEN '<i class="fa fa-windows"></i> Windows Vista'
                WHEN `UserAgent` LIKE '%NT 5.1%' THEN '<i class="fa fa-windows"></i> Windows XP'
                WHEN `UserAgent` LIKE '%NT 5.0%' THEN '<i class="fa fa-windows"></i> Windows 2000'
                ELSE '<i class="fa fa-windows"></i> Windows'
            END      
        WHEN `UserAgent` LIKE '%FreeBSD%' THEN 'FreeBSD'
        WHEN `UserAgent` LIKE '%OpenBSD%' THEN 'OpenBSD'
        WHEN `UserAgent` LIKE '%NetBSD%' THEN 'NetBSD'
        WHEN `UserAgent` LIKE '%OpenSolaris%' THEN 'OpenSolaris'
        WHEN `UserAgent` LIKE '%SunOS%' THEN 'SunOS'
        WHEN `UserAgent` LIKE '%OS/2%' THEN 'OS/2'
        WHEN `UserAgent` LIKE '%BeOS%' THEN 'BeOS'
        ELSE 'Unknown'
    END AS `OS`,
    CASE
        WHEN `UserAgent` LIKE '%edge%'THEN '<i class="fa fa-edge"></i> Edge'
        WHEN `UserAgent` LIKE '%MSIE%' THEN '<i class="fa fa-internet-explorer"></i> Internet Explorer'
        WHEN `UserAgent` LIKE '%Firefox%' THEN '<i class="fa fa-firefox"></i> Mozilla Firefox'
        WHEN `UserAgent` LIKE '%Chrome%' THEN '<i class="fa fa-chrome"></i> Google Chrome'
        WHEN `UserAgent` LIKE '%Safari%' THEN '<i class="fa fa-safari"></i> Apple Safari'
        WHEN `UserAgent` LIKE '%Opera%' THEN '<i class="fa fa-opera"></i> Opera' 
        WHEN `UserAgent` LIKE '%Outlook%' THEN 'Outlook' 
        ELSE 'Unknown'
    END AS `Browser`,
    CASE
        WHEN `UserAgent` LIKE '%WOW64%' THEN '64 bit'
        WHEN `UserAgent` LIKE '%x64%' THEN '64 bit'
        ELSE '32 bit'
    END AS `BitArchitecture`
FROM `Logs`
GROUP BY `Browser`;

1
投票

您可以在组 http 用户代理 sql 上找到用于对不同用户代理/版本进行排序的 SQL 语句(MySQL 和 SQL Server)。它基于来自流行浏览器的 RegExp 和 switch case SQL。


0
投票

请参阅 php 的 get_browser() 函数以从用户代理字符串中识别它。您需要循环所有用户代理字符串,计算每个字符串的结果。


0
投票

我想到了两种方法。

1) 添加仅存储浏览器名称的列。这将使按浏览器分组变得非常容易,但代价是使表格更大。您可以使用 Chris 建议的 get_browser() 函数。

2) 使用 REGEXP 或 LIKE 查询(LIKE“%chrome/%”)单独查询每个浏览器的结果,然后将结果合并在一起。这不需要任何额外的空间,但它会使您的查询更有问题。


0
投票

对于简单的现代案例(

ua
- 用户代理)

case
    when ua like '%iphone%' then 'iphone'
    when ua like '%ipad%' then 'ipad'
    when ua like '%android%' then 'android'
    when ua like '%windows nt%' then 'win'
    when ua like '%macintosh%' then 'mac'
    when ua like '%x11; linux%' then 'linux'
    else 'other'
end as device,
© www.soinside.com 2019 - 2024. All rights reserved.