MySQL选择WHERE IN记录集

时间:2016-02-01 22:45:25

标签: mysql arrays nested where recordset

我会尝试解释我的问题。我有两张桌子。在第一个记录中,每个记录由唯一的INT代码(计数器)标识。在第二个表中,第一个表中的代码是其中一个字段(可以在各种记录中重复)。

我想在第二个表格中根据SELECT CODE参数创建一个WHERE,知道我会得到一个可能重复CODES的记录集,并将此记录集用于另一个第一个表中的SELECTWHERE CODE IN上面的记录集(来自第二个表)。

这可能吗?如果是的话,怎么做?

通常,如果我使用WHERE IN子句,则数组可以包含重复的值,例如WHERE代码IN" 3,4,5,6,3,4, 2" ... 对 ?这里的不同之处在于我想使用先前选择的记录集来代替数组。

1 个答案:

答案 0 :(得分:0)

这可能吗?? 肯定是。

如果是的话,怎么做?像大多数问题一样,答案取决于。皮猫不止一种方法;并且取决于数据(记录量),索引答案可能会有所不同。

您可以使用distinct或group by来限制表A记录,因为来自A - >的连接b是1 - >因此,我们需要对A中的值进行区分或分组,因为它们将被重复。但是如果你也需要来自B的值,这就是你的方法。

pandas

或使用您的方法(如果您只需要表A中的值/列,则有效。)

Select A.Code, max(count B.A_CODE) countOfBRecords
from B
LEFT JOIN A
 on A.Code = B.A_Code
WHERE B.Paramater = 'value'
 and B.Paramater2 = 'Value2'
group by A.Code)

但根据数据/索引,这些可能会很慢。

您不需要内部查询上的distinct,因为A.Code只存在一次,因此不会重复。这是JOIN会导致记录重复而不是where子句。

如果您只需要表A中的值,

-Correlated Subquery将返回单个A.Code。

Select A.Code 
from A
Where code in (Select B.A_CODE
               From B WHERE B.Paramater = 'value'
                and B.Paramater2 = 'Value2')

由于没有连接,所以不会重复A.records。在较大的数据集上,这通常表现得更好。

这最后一种方法有效,因为它将外部表与子选择相关联注意这只能在关系中达到1级。如果您尝试以这种方式加入多个级别,那么它就无法正常工作。