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的查询对我来说效果更好,因为我们论坛的动态特性。我们一直在添加新论坛,我宁愿在查询中添加几行,也不愿每次运行报告时都重建一个临时表。也就是说,我已经存档了将使用您的版本的数据。再次感谢你的帮助!