4

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

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

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

我怎样才能做到这一点?

4

4 回答 4

4

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

下面的 SELECT 按浏览器别名分组。当然,对于 OS 和 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`;
于 2016-11-04T11:43:43.763 回答
1

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

于 2013-08-19T14:36:33.617 回答
0

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

于 2012-05-12T01:05:49.587 回答
0

我想到了两种方法。

1)添加一个只存储浏览器名称的列。这将使通过浏览器进行分组变得非常容易,但会以增大表格为代价。您可以使用Chris 建议的get_browser()函数。

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

于 2012-05-12T01:12:12.813 回答