2014-04-24 20 views
1

我正面临着为以下问题编写sql查询的问题.. 需要帮助!提前致谢。需要SQL查询对于给定的情况

Create Table People(

    person varchar(255); 
    search varchar (255); 

) 

这里的每个人都可以在不同的公司搜索。例如:(作为插入的表格)

INSERT People VALUES('messi','google'); 
INSERT People VALUES('ronaldo','yahoo'); 
INSERT People VALUES('messi','google'); 
INSERT People VALUES('ronaldo','google'); 
INSERT People VALUES('messi','yahoo'); 
INSERT People VALUES('messi','yahoo'); 

现在我想findout既梅西和罗纳尔多多次对谷歌和雅虎 如何搜索,但,我不能使用的话,梅西和罗纳尔多在SQL查询.. 。

我的结果表将是这个样子

Table Result(

    person varchar(255), 
    number of times search on google, 
    number of times search on yahoo, 

) 

回答

3

您需要添加GROUP BY子句这样的:

SELECT 
    person, 
    search, 
    COUNT(*) AS `search_count` 
FROM People 
GROUP BY person, search 

您还应该为每个字段添加一个索引以优化分组。

请注意,这不完全是您问到的结果集格式,但它比每个搜索引擎都有一个列更具可扩展性。例如,如果数据中有其他搜索引擎(Bing,Ask.com等),会发生什么情况?你将不得不重写你的查询以返回更多的列,并且你的代码处理结果集,而不会有额外的列。

映射该结果数据集合到一个有用的数据结构沿着你正在寻找的线条更是死的简单应用层通过执行这样的事情:

$array = array(); 
while ($row = /* Your DB row fetch mechanism here */) { 
    $array[$row['person']][$row['search']] = $row['search_count']; 
} 

这产生了多维阵列你会访问像:

echo $array['messi']['google']; // count of google searches for messi 
echo $array['messi']['yahoo']; // count of yahoo searches for messi 
+2

这是很可能的,这是何等的希望,但'人,search,count'不是问题中请求的输出格式。 –

+0

准确地说,先生,你能否写下查询.. :) – user3148422

+1

@PatrickQ你是对的。我应该在我的回答中提到这一点。原始请求的格式不是真正可扩展的,这更典型地是如何获得这样的数据的方法,因为将计数映射到类似于请求的数据结构在应用层中是非常简单的。 –

2

我认为这是你在找什么。试试看

select person, 
sum(case when search = 'google' then 1 else 0 end) as count_google_search, 
sum(case when search = 'yahoo' then 1 else 0 end) as count_yahoo_search 
from People 
GROUP BY person 

看到这里演示http://sqlfiddle.com/#!2/77bb1/2

编辑:

按照帕特里克的评论

select person, 
sum(search = 'google') as count_google_search, 
sum(search = 'yahoo') as count_yahoo_search 
from People 
GROUP BY person 
+0

你甚至可以通过删除'CASE'语句,只用'SUM(search ='google')'和SUM(search ='yahoo')'。 –

+0

@PatrickQ,真的很不错的选择,欣赏它 – Rahul

+0

这就是查询好了,但罗纳尔多部分是不存在.. :( – user3148422