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