Php 如何从匹配对的MySQL表中找到共享键值?
我有一个两列MySQL表,它代表了一个产品的三种不同选项(大小、颜色等)的变化 该表是由我正在使用的PHP框架(Silverstripe)生成的,因此我无法轻松修改它 如何确定哪个变量ID与特定选项匹配 我可以运行一个MySQL查询,返回带有选项ID 10,20,30的变量的VariationID吗Php 如何从匹配对的MySQL表中找到共享键值?,php,mysql,Php,Mysql,我有一个两列MySQL表,它代表了一个产品的三种不同选项(大小、颜色等)的变化 该表是由我正在使用的PHP框架(Silverstripe)生成的,因此我无法轻松修改它 如何确定哪个变量ID与特定选项匹配 我可以运行一个MySQL查询,返回带有选项ID 10,20,30的变量的VariationID吗 如果在原始MySQL中不可能,那么PHP中最好的方法是什么?您可以直接使用SQL,但它有点混乱: SELECT A.VariationID AS VariationID FROM tabl
如果在原始MySQL中不可能,那么PHP中最好的方法是什么?您可以直接使用SQL,但它有点混乱:
SELECT
A.VariationID AS VariationID
FROM
tablename AS A
INNER JOIN tablename AS B ON A.VariationID=B.VariationID
INNER JOIN tablename AS C ON A.VariationID=C.VariationID
WHERE
A.OptionID=10
AND B.OptionID=20
AND C.OptionID=30
这将找到行的
VariationID
,它存在于OptionID
值10、20和30中。您可以直接使用SQL,但它有点混乱:
SELECT
A.VariationID AS VariationID
FROM
tablename AS A
INNER JOIN tablename AS B ON A.VariationID=B.VariationID
INNER JOIN tablename AS C ON A.VariationID=C.VariationID
WHERE
A.OptionID=10
AND B.OptionID=20
AND C.OptionID=30
这将找到行的
VariationID
,它存在于OptionID
值10、20和30中。您可以直接使用SQL,但它有点混乱:
SELECT
A.VariationID AS VariationID
FROM
tablename AS A
INNER JOIN tablename AS B ON A.VariationID=B.VariationID
INNER JOIN tablename AS C ON A.VariationID=C.VariationID
WHERE
A.OptionID=10
AND B.OptionID=20
AND C.OptionID=30
这将找到行的
VariationID
,它存在于OptionID
值10、20和30中。您可以直接使用SQL,但它有点混乱:
SELECT
A.VariationID AS VariationID
FROM
tablename AS A
INNER JOIN tablename AS B ON A.VariationID=B.VariationID
INNER JOIN tablename AS C ON A.VariationID=C.VariationID
WHERE
A.OptionID=10
AND B.OptionID=20
AND C.OptionID=30
这将找到行的
VariationID
,它们存在于OptionID
值为10、20和30的组合,其中OptionID位于(…)
、分组依据
和计数(…)=3
。类似的问题以前已经讨论过多次,因此,我建议您使用这些关键字进行一些研究。@c使用IN()
、groupby
和HAVING COUNT()
作为典型答案,这对MySQL优化器来说往往是最坏的情况。@EugenRieck,我知道这不是最好的性能选择–但如果它不再寻找3个选项,您会怎么做,但是一打或两打——写两打连接?不确定这是否更好。@CBroe如果是十几个或更多,则对一个临时表执行完整的分组,然后通过进行筛选,所需的成本更大。因此,尽管这是违反直觉的,但即使是这样,JOIN
通常也会表现得更好。如果实现了非常低的选择性,即当基表中的行数很少,但需要对许多条件进行连接检查时,按
分组的速度更快。的组合,其中OptionID在(…)
中,按
分组和计数(…)=3
之前已经多次讨论过类似的问题,因此,我建议您使用这些关键字进行一些研究。@c使用IN()
、groupby
和HAVING COUNT()
作为典型答案,这对MySQL优化器来说往往是最坏的情况。@EugenRieck,我知道这不是最好的性能选择–但如果它不再寻找3个选项,您会怎么做,但是一打或两打——写两打连接?不确定这是否更好。@CBroe如果是十几个或更多,则对一个临时表执行完整的分组,然后通过进行筛选,所需的成本更大。因此,尽管这是违反直觉的,但即使是这样,JOIN
通常也会表现得更好。如果实现了非常低的选择性,即当基表中的行数很少,但需要对许多条件进行连接检查时,按
分组的速度更快。的组合,其中OptionID在(…)
中,按
分组和计数(…)=3
之前已经多次讨论过类似的问题,因此,我建议您使用这些关键字进行一些研究。@c使用IN()
、groupby
和HAVING COUNT()
作为典型答案,这对MySQL优化器来说往往是最坏的情况。@EugenRieck,我知道这不是最好的性能选择–但如果它不再寻找3个选项,您会怎么做,但是一打或两打——写两打连接?不确定这是否更好。@CBroe如果是十几个或更多,则对一个临时表执行完整的分组,然后通过进行筛选,所需的成本更大。因此,尽管这是违反直觉的,但即使是这样,JOIN
通常也会表现得更好。如果实现了非常低的选择性,即当基表中的行数很少,但需要对许多条件进行连接检查时,按
分组的速度更快。的组合,其中OptionID在(…)
中,按
分组和计数(…)=3
之前已经多次讨论过类似的问题,因此,我建议您使用这些关键字进行一些研究。@c使用IN()
、groupby
和HAVING COUNT()
作为典型答案,这对MySQL优化器来说往往是最坏的情况。@EugenRieck,我知道这不是最好的性能选择–但如果它不再寻找3个选项,您会怎么做,但是一打或两打——写两打连接?不确定这是否更好。@CBroe如果是十几个或更多,则对一个临时表执行完整的分组,然后通过进行筛选,所需的成本更大。因此,尽管这是违反直觉的,但即使是这样,JOIN
通常也会表现得更好。如果实现了非常低的选择性,即当基表中的行很少,但许多条件需要进行联接检查时,分组方式
会更快。是否有理由在
中使用两个联接而不仅仅是?经典的in()
、分组方式
和具有COUNT()
在MySQL上的性能往往非常差,而连接速度相当快,如果索引到位并且假设有合理的选择性。非常好-感谢您对这种方法与in,GROUP BY,have COUNT()进行的评论-非常有帮助。您为什么在中使用两个连接而不仅仅是?经典的in())
、分组依据
和拥有计数()
在M上的表现往往非常糟糕