1

无法通过通配符对活动论坛总和结果进行分组。

最终,我希望将所有具有相似名称的结果分组并汇总在不同的行中。

表:论坛

栏目:游戏、帖子

当前查询:

SELECT game, sum(posts) FROM forums WHERE posts>1 AND game like
'%rift%' OR game like '%swiftsure%' GROUP BY name

当前结果:

游戏 帖子

Rift (PVP Defiant): Briarcliff 3406

裂谷指南 100

裂谷领袖 1541

秘境突袭讨论 1336

秘境突袭领导 533

秘境:牧师 85

秘境:法师 87

裂谷:私人411

秘境:PVE 领导力 113

裂谷:盗贼 56

裂谷:战士29

星球大战旧共和国 PvP - Swiftsure 7

SWTOR Swiftsure 领导力 0

SWTOR:Swiftsure Private 7

所需的结果如下所示:

游戏 | 帖子

裂痕 | 7697

迅捷| 14

我当然感谢任何和所有的帮助!

4

4 回答 4

3

由于您正在寻找通用分组,我会做一个 CASE/WHEN 作为列...

SELECT case when game like '%rift%'      then 'Rift   '
            when game like '%swiftsure%' then 'Swiftsure'
       end as GroupName,
       count(*) as  PostCount
   from
      forums
   where
         game like '%rift%' 
      OR game like '%swiftsure%' 
   GROUP BY
      GroupName
于 2012-04-30T16:58:54.213 回答
2

试试这个:http ://www.sqlfiddle.com/#!2/f6be7/4

select x.Name, COUNT(p.Name)
from
(
  SELECT 'JOHN' AS NAME
  UNION
  SELECT 'PAUL'  
  ) as x
LEFT JOIN Person p ON p.Name LIKE CONCAT('%',x.NAME, '%')
GROUP BY x.Name

样本数据:

create table person
(
  name varchar(100)
  );


insert into person values
('JOHN LENNON'),
('WINSTON JOHN LENNON'),
('MICHAEL JOHN FOX'),
('PAUL McCartney'),
('SEAN PAUL DATA'),
('GREAT PAUL OF FIRE'),
('ST PAUL OF X');

输出:

NAME    COUNT(P.NAME)
JOHN    3
PAUL    4

如果要数 GEORGE,只需在 UNION 上添加即可:

select x.Name, COUNT(p.Name)
from
(
  SELECT 'JOHN' AS NAME
  UNION
  SELECT 'PAUL'  
  UNION
  SELECT 'GEORGE'
  ) as x
LEFT JOIN Person p ON p.Name LIKE CONCAT('%',x.NAME, '%')
GROUP BY x.Name

输出:

NAME    COUNT(P.NAME)
GEORGE  0
JOHN    3
PAUL    4

太糟糕了 MySQL 没有 unnest 功能。使用 Postgresql 更简单:http ://www.sqlfiddle.com/#!1/87c74/5

select x.Name, count(p.Name)
from 
unnest(array['John','Paul','George']) as x(Name)
left join Person p ON p.Name ilike concat('%',x.Name, '%')
group by x.Name

您甚至可以直接将服务器端语言中的逗号分隔字符串用于 Postgresql,只需在该逗号分隔字符串周围放置一个大括号:http ://www.sqlfiddle.com/#!1/87c74/17

select x.Name, count(p.Name)
from 
unnest('{John,Paul,George}'::text[]) as x(Name)
left join Person p ON p.Name ilike concat('%',x.Name, '%')
group by x.Name

这也适用于 Postgresql,值列表可以直接在查询中使用(而在 MySQL 中,值列表只能在 DDL 上使用):http ://www.sqlfiddle.com/#!1/87c74/9

select x.Name, count(p.Name)
from 
(values('John'),('Paul'),('George')) as x(Name)
left join Person p ON p.Name ilike concat('%',x.Name, '%')
group by x.Name

FROM 子句上的值列表也适用于 Microsoft Sql Server:http ://www.sqlfiddle.com/#!3/87c74/3

于 2012-04-30T17:10:43.737 回答
0

我可能会选择:

  INSERT INTO working_table (keyword, connection)
  VALUES ('rift', connection_id())('swiftsure', connection_id());

  SELECT w.keyword, count(*)
  FROM forums f
  INNER JOIN working_table w
  ON f.game LIKE CONCAT('%', w.keyword, '%')
  WHERE w.connection=connection_id()
  AND forms.posts>1
  GROUP BY w.keyword;

  DELETE FROM working_table
  WHERE connection=connection_id();

不过它会像一条两条腿的狗一样奔跑。真的,如果我这样做,我会使用适当的搜索引擎模式。

于 2012-04-30T16:40:45.710 回答
0

您需要将两个 OR'd 条件放在括号中。没有它们,AND 具有更高的优先级。

SELECT case when game like ... end as game, sum(posts)
FROM forums
WHERE posts > 1 AND (game like '%rift%' OR game like '%swiftsure%')
GROUP BY name
于 2015-02-21T02:11:42.023 回答