我有一个表格,每一行都包含有关用户页面加载的数据。其中一个字段是该命中的用户代理。如何按浏览器对结果进行分组?我可以按常见的用户代理分组:
SELECT useragent, COUNT(useragent) AS c
FROM hitstable
GROUP BY useragent
ORDER BY c DESC
但我想按浏览器分组,无论版本或其他数据如何变化。我希望它输出一个列表,列出浏览器的常见程度。
我怎样才能做到这一点?
我有一个表格,每一行都包含有关用户页面加载的数据。其中一个字段是该命中的用户代理。如何按浏览器对结果进行分组?我可以按常见的用户代理分组:
SELECT useragent, COUNT(useragent) AS c
FROM hitstable
GROUP BY useragent
ORDER BY c DESC
但我想按浏览器分组,无论版本或其他数据如何变化。我希望它输出一个列表,列出浏览器的常见程度。
我怎样才能做到这一点?
我发现使用 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`;
您可以在组 http 用户代理 sql上找到用于对不同用户代理/版本进行排序的 SQL 语句(MySQL 和 SQL Server)。它基于 RegExp 和流行浏览器的 switch case SQL。
请参阅 php 的 get_browser() 函数以从用户代理字符串中识别它。您需要遍历所有用户代理字符串,计算每个字符串的结果。
我想到了两种方法。
1)添加一个只存储浏览器名称的列。这将使通过浏览器进行分组变得非常容易,但会以增大表格为代价。您可以使用Chris 建议的get_browser()函数。
2) 使用 REGEXP 或 LIKE 查询 (LIKE "%chrome/%") 分别查询每个浏览器的结果,然后将结果合并在一起。这不需要任何额外的空间,但它会使您的查询更成问题。