MySQL Select 记录集中的位置

MySQL Select WHERE IN recordset

我会尽力解释我的问题。我有两个 table。在第一个中,每条记录都由一个唯一的 INT 代码(计数器)标识。在第二个中,第一个 table 中的代码是其中一个字段(并且可能在各种记录中重复)。

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

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

通常,如果我使用 WHERE IN 子句,数组可以包含重复值,例如 WHERE Code IN "3,4,5,6,3,4,2 “ ... 正确的 ?这里的区别是我想使用以前选择的记录集代替数组。

这可能吗??当然可以。

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

您可以使用 distinct 或 group by 来限制 table A 记录,因为来自 A--> b 的连接是 1--> many 因此我们需要根据来自的值来区分或分组A 因为它们会被重复。但是如果你也需要 B 的值,这就是实现它的方法。

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)

或者使用您的方法(如果您只需要 table A 中的 values/columns 就有效)

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

但这些可能会很慢,具体取决于 data/indexes。

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

-相关子查询将 return 如果您只需要来自 table A.

的值,则单个 A.Code 可以工作
Select A.Code
From A
Where exists (Select 1 
              from B 
              where b.paramter = value ... 
                AND A.Code = B.A_CODE)

由于没有加入,因此不会重复 A.records。在更大的数据集上,这通常表现更好。

最后一种方法之所以有效,是因为它将外部 table 与子 select 相关联 请注意,这只能在关系中达到 1 级。如果您尝试以这种方式加入多个层次,那将行不通。