Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql按通配符选择查询分组_Mysql_Select_Sum_Wildcard - Fatal编程技术网

Mysql按通配符选择查询分组

Mysql按通配符选择查询分组,mysql,select,sum,wildcard,Mysql,Select,Sum,Wildcard,无法按通配符对活动论坛总和结果进行分组 最后,我希望所有具有相似名称的结果分组并汇总到不同的行中 表:论坛 专栏:游戏、帖子 当前查询: SELECT game, sum(posts) FROM forums WHERE posts>1 AND game like '%rift%' OR game like '%swiftsure%' GROUP BY name 目前的结果: 游戏帖子 裂谷(PVP违抗):Briarcliff3406 裂谷导板100 裂痕领导力1541 裂谷突袭讨论13

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

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

表:论坛

专栏:游戏、帖子

当前查询:

SELECT game, sum(posts) FROM forums WHERE posts>1 AND game like
'%rift%' OR game like '%swiftsure%' GROUP BY name
目前的结果:

游戏帖子

裂谷(PVP违抗):Briarcliff3406

裂谷导板100

裂痕领导力1541

裂谷突袭讨论1336

裂谷突袭领导力533

裂痕:牧师85

裂痕:法师87

裂痕:私人411

裂痕:PVE领导力113

裂痕:盗贼56

裂痕:战士29

星球大战旧共和国PvP-雨燕7

SWTOR雨燕领导力0

SWTOR:Swiftsure Private7

预期结果如下所示:

游戏|帖子

裂谷|7697

雨燕|14

我当然感谢所有的帮助

我可能会选择:

  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();
不过它会跑得像一条两条腿的狗。真的,如果我这样做,我会使用合适的搜索引擎模式。

我可能会选择:

  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();

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

既然你在寻找通用分组,我会做一个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

由于您正在寻找通用分组,我将在列中使用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
试试这个:

样本数据:

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
NAME    COUNT(P.NAME)
GEORGE  0
JOHN    3
PAUL    4

如果你想数一数乔治,你只需将其添加到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)
JOHN    3
PAUL    4
NAME    COUNT(P.NAME)
GEORGE  0
JOHN    3
PAUL    4

可惜MySQL没有最不常用的功能。使用Postgresql,事情更简单:

您甚至可以直接将服务器端语言中的逗号分隔字符串用于Postgresql,只需在逗号分隔字符串周围放一个小括号:

这也适用于Postgresql,值列表可以直接用于查询(而在MySQL中,值列表只能用于DDL):

FROM子句上的值列表也适用于Microsoft Sql Server:

尝试以下操作:

样本数据:

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
NAME    COUNT(P.NAME)
GEORGE  0
JOHN    3
PAUL    4

如果你想数一数乔治,你只需将其添加到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)
JOHN    3
PAUL    4
NAME    COUNT(P.NAME)
GEORGE  0
JOHN    3
PAUL    4

可惜MySQL没有最不常用的功能。使用Postgresql,事情更简单:

您甚至可以直接将服务器端语言中的逗号分隔字符串用于Postgresql,只需在逗号分隔字符串周围放一个小括号:

这也适用于Postgresql,值列表可以直接用于查询(而在MySQL中,值列表只能用于DDL):


FROM子句上的值列表也适用于Microsoft Sql Server:

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

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

您需要将两个或多个条件放在括号中。没有它们,它的优先级更高

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

当名称为“%rift%”时选择大小写,当名称为“%swiftsure%”时选择“rift”,当名称为“%swiftsure%”时选择“rift”,当名称为“%swiftsure%”时选择“swiftsure”后选择“GroupName”,然后从ipb_论坛中选择SUM(posts)作为PostCount,其中名称为“%rift%”或名称为“%swiftsure%”时,按组名分组限制为0,30。此代码感觉非常脆弱。字符串有重复(相当于三倍)。这不能计算不匹配的条件。当需要计算不匹配的行数时,很难将此查询调整为该需求。请看我的答案,查找George:对于从静态数据中提取各种报告,您是正确的,因为您的报告更干净、更高效。来自DRapp的查询对我来说效果更好,因为我们论坛的动态特性。我们一直在添加新论坛,我宁愿在查询中添加几行,也不愿每次运行报告时都重建一个临时表。也就是说,我已经存档了将使用您的版本的数据。再次感谢你的帮助!当名称为“%rift%”时选择大小写,当名称为“%swiftsure%”时选择“rift”,当名称为“%swiftsure%”时选择“rift”,当名称为“%swiftsure%”时选择“swiftsure”后选择“GroupName”,然后从ipb_论坛中选择SUM(posts)作为PostCount,其中名称为“%rift%”或名称为“%swiftsure%”时,按组名分组限制为0,30。此代码感觉非常脆弱。字符串有重复(相当于三倍)。这不能计算不匹配的条件。当需要计算不匹配的行数时,很难将此查询调整为该需求。请看我的答案,查找George:对于从静态数据中提取各种报告,您是正确的,因为您的报告更干净、更高效。来自DRapp的查询对我来说效果更好,因为我们论坛的动态特性。我们一直在添加新论坛,我宁愿在查询中添加几行,也不愿每次运行报告时都重建一个临时表。也就是说,我已经存档了将使用您的版本的数据。再次感谢你的帮助!