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