Mysql 多重计数正则表达式在双格内匹配以获取两个变量。我能做得更好吗?
我在案例中使用了几个计数来为两个查询结果变量创建排名值 下面的代码实际上是一个更大的查询中的左外连接,正如您可能猜到的,它会稍微降低速度。 有没有办法改善这一点?我已经读了好几个小时了,非常感谢您的帮助Mysql 多重计数正则表达式在双格内匹配以获取两个变量。我能做得更好吗?,mysql,Mysql,我在案例中使用了几个计数来为两个查询结果变量创建排名值 下面的代码实际上是一个更大的查询中的左外连接,正如您可能猜到的,它会稍微降低速度。 有没有办法改善这一点?我已经读了好几个小时了,非常感谢您的帮助 选择 美国身份证, 将(C.assets_animal_name REGEXP‘猫|狗|鸟|鼠|马|牛’)计算为Lematchescont, 合并( (案例 当计数(C.assets_animal_name REGEXP‘猫|狗|鸟|鼠|马|牛’)=6时,则为3.33 当计数(C.assets_
选择
美国身份证,
将(C.assets_animal_name REGEXP‘猫|狗|鸟|鼠|马|牛’)计算为Lematchescont,
合并(
(案例
当计数(C.assets_animal_name REGEXP‘猫|狗|鸟|鼠|马|牛’)=6时,则为3.33
当计数(C.assets_animal_name REGEXP‘猫|狗|鸟|鼠|马|牛’)=5时,则为2.75
当计数(C.assets_animal_name REGEXP'cats | dogs | birds | rats | mars | cows)<5并计数(C.assets_animal_name REGEXP'cats | dogs | birds | rats | mars | cows)>=2,然后是1.11
当计数(C.assets_animal_name REGEXP‘猫|狗|鸟|鼠|马|牛’)=1时,则为0.55
(完)
,0)作为leRank1,
如果(匹配(C.assets\u animal\u name)与布尔模式下的(“任何动物”),1.11,
结合(
(案例
当计数(C.assets_animal_name REGEXP‘猫|狗|鸟|鼠|马|牛’)=6时,则为1.11
当计数(C.assets_animal_name REGEXP‘猫|狗|鸟|鼠|马|牛’)=5时,则为0.88
当计数(C.assets_animal_name REGEXP'cats | dogs | birds | rats | mars | cows)<5并计数(C.assets_animal_name REGEXP'cats | dogs | birds | rats | mars | cows)>=2时,则为0.37
当计数(C.assets_animal_name REGEXP‘猫|狗|鸟|鼠|马|牛’)=1时,则为0.18
(完)
,0))作为leRank2
从…起
us3r U
左外连接资源\u打开
C.user_id=U.id和C.assets_animal_name IN('cats','dogs','birds','rats','mars','cows'))
分组
身份证
Edit1:
这个查询是动态构建的,我不知道用于排名的参数有多少
在本例中,当4行中的每一行尝试匹配一个动态数字(此处为6)并将每个匹配评级为(在服务器端进行计算,这是一个逻辑输出):
WHEN=6秩=5.00
当=(6-1)秩=3.80时
当<(6-1)和>2时=2.90
当秩=1时,秩=1.11
请注意,在第三行,代码检查是否存在”2
正如Ross Smith II所指出的,在WHEN之外使用计数将不允许我首先使用像“这样的操作数
将匹配brats
以及rats
。您可能需要:
IN ('cats','dogs','birds','rats','horses','cows')
或许
REGEXP '^(cats|dogs|birds|rats|horses|cows)$'
第二,如果用CASE x WHEN
替换CASE x WHEN
,这将简化一些事情
最后,我将把最后一个JOIN子句移动到WHERE,因为它并不是真正地连接表
以下是重写的查询:
SELECT
U.id,
COUNT(C.assets_animal_name IN ('cats','dogs','birds','rats','horses','cows')) AS leMatchesCount,
COALESCE(
(CASE COUNT(C.assets_animal_name IN ('cats','dogs','birds','rats','horses','cows'))
WHEN 6 THEN 3.33
WHEN 5 THEN 2.75
WHEN 4 THEN 1.11
WHEN 3 THEN 1.11
WHEN 2 THEN 1.11
WHEN 1 THEN 0.55
END)
, 0) AS leRank1,
IF(MATCH(C.assets_animal_name) AGAINST ("any animal" IN BOOLEAN MODE), 1.11,
COALESCE(
(CASE COUNT(C.assets_animal_name IN ('cats','dogs','birds','rats','horses','cows'))
WHEN 6 THEN 1.11
WHEN 5 THEN 0.88
WHEN 4 THEN 0.37
WHEN 3 THEN 0.37
WHEN 2 THEN 0.37
WHEN 1 THEN 0.18
END)
, 0)) AS leRank2
FROM
us3r U
LEFT OUTER JOIN
assets_animals C ON
C.user_id = U.id
WHERE
C.assets_animal_name IN ('cats','dogs','birds','rats','horses','cows')
GROUP BY
U.id
让我们知道这是否有助于提高性能。Wow。这要求在分组方式方面进行完全重构。您能给出表定义和一些示例数据吗?表C是MyISAM,我正在对C匹配的出现次数进行动态排序。表U是一个简单的用户表,带有他的id、mail等,用于显示用户matches排名。数据类似于userid1在C上有3个动物,userid2有6个动物,其中根据查询匹配对结果进行排名。您可以将此信息添加到原始帖子(并删除评论)中吗?同时给出表C的10-20个样本行和匹配的U行。真的很好。请参阅我的编辑。感谢REGEX/IN提示。使用外部计数可以使我在合并中进行6次计数,而不是10次计数。
SELECT
U.id,
COUNT(C.assets_animal_name IN ('cats','dogs','birds','rats','horses','cows')) AS leMatchesCount,
COALESCE(
(CASE COUNT(C.assets_animal_name IN ('cats','dogs','birds','rats','horses','cows'))
WHEN 6 THEN 3.33
WHEN 5 THEN 2.75
WHEN 4 THEN 1.11
WHEN 3 THEN 1.11
WHEN 2 THEN 1.11
WHEN 1 THEN 0.55
END)
, 0) AS leRank1,
IF(MATCH(C.assets_animal_name) AGAINST ("any animal" IN BOOLEAN MODE), 1.11,
COALESCE(
(CASE COUNT(C.assets_animal_name IN ('cats','dogs','birds','rats','horses','cows'))
WHEN 6 THEN 1.11
WHEN 5 THEN 0.88
WHEN 4 THEN 0.37
WHEN 3 THEN 0.37
WHEN 2 THEN 0.37
WHEN 1 THEN 0.18
END)
, 0)) AS leRank2
FROM
us3r U
LEFT OUTER JOIN
assets_animals C ON
C.user_id = U.id
WHERE
C.assets_animal_name IN ('cats','dogs','birds','rats','horses','cows')
GROUP BY
U.id