Php 如何从匹配对的MySQL表中找到共享键值?

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框架(Silverstripe)生成的,因此我无法轻松修改它

如何确定哪个变量ID与特定选项匹配

我可以运行一个MySQL查询,返回带有选项ID 10,20,30的变量的VariationID吗


如果在原始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上的表现往往非常糟糕