0

嗨,我得到了关于用户浏览器的数据库日志,它显示 f.ex:Firefox 6.0.2、Firefox 6.0.0 Chrome 14.0.835.163 和其他版本....等等

这都是关于浏览器版本的。我的问题是可以在浏览器名称为-> firefox(所有版本)、chrome(所有版本)的地方做sql问题。我需要计算它们现在我得到了这样的东西:

SELECT `logs`.`log_browser`, COUNT(*) AS `amount` 
FROM `logs` GROUP BY `log_browser`

但它以不同的行返回 Firefox 6.0.2 和 Firefox 6.0.0 可能吗?还是我必须在 php 中使用结果?

4

4 回答 4

2

你可以这样做

SQL 小提琴

select REPLACE(log_browser, substring_index(log_browser,' ',-1),'') log_browser, 
count(*) cnt
from logs group by log_browser;
于 2012-11-14T22:36:46.053 回答
1

这样的事情怎么样?这用于LOCATE查找第一个空格,并将分组并返回浏览器名称的左侧部分。

SELECT LEFT(log_browser, LOCATE(' ', log_browser)) AS browser, COUNT(*) AS amount
FROM logs
GROUP BY LEFT(log_browser, LOCATE(' ', log_browser))

看到它在行动

架构

创建表日志(
  log_browser varchar(25));

插入日志值
('Firefox 6.0.2'),
('Firefox 6.0.0'),
('Chrome 14.0.835.163')

结果

| 浏览器 | 数量 |
---------------------
| 铬 | 1 |
| 火狐 | 2 |
于 2012-11-14T22:35:50.103 回答
0

如果执行速度不是问题,那么之前给出的(由其他人 - 但已删除)答案的扩展版本将很有用。您可以添加任何其他浏览器名称并使用 OR 对不同的语法进行分组

SELECT CASE 
WHEN `log_browser` like '%Firefox%' Then 'FIREFOX'
WHEN `log_browser` like '%Chrome%%' Then 'CHROME'
WHEN `log_browser` like '%Explorer%' Then 'INTERNET EXPLORER'
WHEN `log_browser` like '%Opera%%' Then 'OPERA'
ELSE LEFT(log_browser,10) 
END Browser, count(*) from logs
group by 
CASE 
WHEN `log_browser` like '%Firefox%' Then 'FIREFOX'
WHEN `log_browser` like '%Chrome%%' Then 'CHROME'
WHEN `log_browser` like '%Explorer%' Then 'INTERNET EXPLORER'
WHEN `log_browser` like '%Opera%%' Then 'OPERA'
ELSE LEFT(log_browser,10) 
END
于 2012-11-14T23:06:13.487 回答
-1

您可能希望在 group by 子句中使用 substring 函数,假设浏览器最多以 n 个字符标识自己,例如 chrome 是 6 个字母,您可以这样做:

SELECT `logs`.`log_browser`, COUNT(*) AS `amount` 
FROM `logs` GROUP BY SUBSTRING(`log_browser`,1,6)
于 2012-11-14T22:45:28.763 回答