我有一个表,每行包含有关用户加载的页面的数据。其中一个字段是该点击的用户代理。如何按浏览器对结果进行分组?我可以按常见的用户代理进行分组:
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 按浏览器别名分组。当然,对于操作系统和 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/%”)单独查询每个浏览器的结果,然后将结果合并在一起。这不需要任何额外的空间,但它会使您的查询更有问题。
对于简单的现代案例(
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,