我面临着为以下问题编写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');
现在我想在谷歌和雅虎上搜索多少次梅西和罗纳尔多 但是,我不能在sql QUERY中使用词汇messi和ronaldo ......
我的结果表将如下所示
Table Result(
person varchar(255),
number of times search on google,
number of times search on yahoo,
)
答案 0 :(得分: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
答案 1 :(得分: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