Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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_Performance - Fatal编程技术网

Mysql 有没有更好的方法来执行此查询?

Mysql 有没有更好的方法来执行此查询?,mysql,performance,Mysql,Performance,我对MYSQL有点陌生,这个查询很有效,但不知道是否有更有效的方法。 我有两张桌子…客户桌和客户技能。两个表都有一个“client_id”列。我试图只选择与所有要求的技能代码和类型匹配的客户机 这是我第一次尝试的。。。(除非您更改并更改为或,否则不起作用) 然后我尝试了这个。。。(它工作并返回我想要的结果) 但是,如果有一个更短或更有效的方法来做到这一点,我愿意学习。 感谢您的帮助第二个比第一个慢,因为您正在执行4个查询,因此在这两个示例之间,只需使用第一个示例,使用AND或代替AND即可 可能

我对MYSQL有点陌生,这个查询很有效,但不知道是否有更有效的方法。 我有两张桌子…客户桌客户技能。两个表都有一个“client_id”列。我试图只选择与所有要求的技能代码和类型匹配的客户机

这是我第一次尝试的。。。(除非您更改并更改为或,否则不起作用)

然后我尝试了这个。。。(它工作并返回我想要的结果)

但是,如果有一个更短或更有效的方法来做到这一点,我愿意学习。
感谢您的帮助

第二个比第一个慢,因为您正在执行4个查询,因此在这两个示例之间,只需使用第一个示例,使用AND或代替AND即可

可能有更好/更快的查询,但这取决于需求和表的索引

例如,你真的需要技能类型吗?你能有两种相同代码和不同类型的技能吗?如果所有技能代码都不同,只需执行以下操作:

SELECT * FROM client_table
LEFT JOIN client_skills ON client_table.client_id = client_skills.client_id
WHERE skill_code IN ('97','65','23')
如果你有一个关于skill_代码的索引,那么查询也会更快

编辑:好的,现在我理解了您的问题,您至少需要2个查询,一个用于获取与树技能匹配的所有客户端ID,另一个用于获取具有这些ID的客户端,请尝试以下操作:

SELECT * from client_table WHERE client_id IN (
  SELECT client_id FROM client_skills WHERE (skill_code='97' AND skill_type='0') OR 
  (skill_code='65' AND skill_type='0') OR (skill_code='23' AND skill_type='5')
  GROUP BY client_id HAVING count(*) = 3)
你在那里做的是:

  • 获取所有客户技能记录,以匹配您所需的三项技能中的任何一项
  • 按客户端id对它们进行分组
  • 仅为正好有3条记录的组选择客户端id(这意味着这些组具有所有三项技能)
  • 选择子查询返回的ID中包含ID的所有客户端
  • 我认为这是最快的方法,只有两个查询,我不认为一个查询就可以完成


    注意:该查询未经测试,这是您的想法,您可能需要玩一点游戏,让您的第一个查询使用
    进行修改。您可以使用
    联合

    SELECT client_id FROM client_skills WHERE (skill_code='97' AND skill_type='0')
    UNION
    SELECT client_id FROM client_skills WHERE (skill_code='65' AND skill_type='0')
    UNION
    SELECT client_id FROM client_skills WHERE (skill_code='23' AND skill_type='5')
    
    编辑 你可以完成这样的事情<代码>自连接
    是必需的。(未对您的数据进行测试):


    这就是你想要的,因为你想用
    而不是
    
    在我的例子中,只有Jeff拥有全部3项技能(该技能代码和技能类型)


    这与第二个查询的逻辑相同。

    我非常确定第一个查询为什么不起作用。它正试图在客户端技能表中查找技能代码分别为97和65的行-这是不可能的,因为它只能有1个值。这个问题似乎离题了,因为它是关于a的。@mdml:事实上,我想知道这些天的主题是什么。如果技能代码列中对技能类型进行了编码,或者没有问题,但可惜不是这样!客户技能中有一个主键,但它不用于任何用途。即使我使用主键来识别技能,并且去掉了技能代码和技能类型列,我如何选择with而不是OR?嗯,理想情况下,我想我应该使用主键ID,并使用另一个表来定义哪些ID属于哪个技能类型。但我不想让事情变得过于复杂,并且让技能ID的长度保持较短。但是,即使我使用主键,我如何选择使用AND而不是OR?因此,您正在寻找所有这3个(skill\u代码,skill\u类型)的客户机?啊,您所做的子查询非常好,因为它只是一个子查询,而不是几个子查询!我会投票,但我还需要7点声望!谢谢,但是有没有一种方法来代替或呢?@user3034654啊哈!您正在查找的客户端id与这三个条件都匹配!请稍候。@user3034654查看我的更新。这是你想要的吗?如果没有,你需要提供更多关于你想要什么的信息。样本数据和样本输出。非常感谢!我想投票,但我需要7个以上的声誉才能被允许!如果您的数据实际上是某种字符串而不是数字,那么您可能希望在97,65,23和0,0,5值周围加上单引号,在我的示例中,它们都是
    int
    SELECT
        client_table.*
        ,SUM(
            IF( skill_code='97' AND skill_type='0' ,1 ,0 )
            +
            IF( skill_code='65' AND skill_type='0' ,1 ,0 )
            +
            IF( skill_code='23' AND skill_type='5' ,1 ,0 )
        ) AS skill_code_type_count
    FROM
        client_table
        LEFT JOIN client_skills ON client_table.client_id = client_skills.client_id
    GROUP BY
        client_table.client_id
    HAVING
        skill_code_type_count >= 3
    
    SELECT client_id FROM client_skills WHERE (skill_code='97' AND skill_type='0')
    UNION
    SELECT client_id FROM client_skills WHERE (skill_code='65' AND skill_type='0')
    UNION
    SELECT client_id FROM client_skills WHERE (skill_code='23' AND skill_type='5')
    
    SELECT t1.client_id
    FROM client_skills t1 JOIN client_skills t2 ON t1.client_id = t2.client_id
                AND t1.skill_code='97' AND t1.skill_type='0'
                AND t2.skil_code='65' AND t2.skill_type='0'
        JOIN client_skills t3 ON t3.client_id = t1.client_id
                AND t3.skil_code='23' AND t3.skill_type='5'
    
    SELECT c.*
    FROM client_table c,
         client_skills s1,
         client_skills s2,
         client_skills s3
    WHERE
          c.client_id = s1.client_id AND s1.skill_code=97 AND s1.skill_type=0
      AND c.client_id = s2.client_id AND s2.skill_code=65 AND s2.skill_type=0
      AND c.client_id = s3.client_id AND s3.skill_code=23 AND s3.skill_type=5
    
    SELECT
        client_table.*
        ,SUM(
            IF( skill_code='97' AND skill_type='0' ,1 ,0 )
            +
            IF( skill_code='65' AND skill_type='0' ,1 ,0 )
            +
            IF( skill_code='23' AND skill_type='5' ,1 ,0 )
        ) AS skill_code_type_count
    FROM
        client_table
        LEFT JOIN client_skills ON client_table.client_id = client_skills.client_id
    GROUP BY
        client_table.client_id
    HAVING
        skill_code_type_count >= 3