Sql组由浏览器组成

时间:2012-11-14 22:31:04

标签: php sql

嗨,我收到了关于用户浏览器的数据库日志,并显示了f.ex: Firefox 6.0.2,Firefox 6.0.0 Chrome 14.0.835.163等版本.... 还有更多

所有关于浏览器的版本。我的问题是可以做sql问题浏览器名称是什么 - > firefox(所有版本),chrome(所有版本)。我需要数他们 现在我得到了这样的东西:

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

但它将Firefox 6.0.2和Firefox 6.0.0作为不同的行返回给我 可能吗?或者我必须在php中使用结果吗?

4 个答案:

答案 0 :(得分:2)

你可以这样做

SQL FIDDLE

select REPLACE(log_browser, substring_index(log_browser,' ',-1),'') log_browser, 
count(*) cnt
from logs group by log_browser;

答案 1 :(得分:1)

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

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

See it in action

<强>模式

CREATE TABLE logs (
  log_browser varchar(25));

INSERT INTO logs VALUES
('Firefox 6.0.2'),
('Firefox 6.0.0'),
('Chrome 14.0.835.163')

<强>结果

|  BROWSER | AMOUNT |
---------------------
|  Chrome  |      1 |
| Firefox  |      2 |

答案 2 :(得分: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

答案 3 :(得分:-1)

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

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