大家下午好!你可以帮帮我吗? :)

数据库示例:

ID  Catalog Code  Description Type  Supplier  Supplier Code

1   6083          TV LG 32    tv    lg        ud28f1137ka-ga-i2-tr
1   6083          TV LG 32    tv    samsung   asfb1145-ssd          # select it
2   6129          Phone 5X    phone apple     mics_rp
2   6129          Phone 5X    phone htc       nco_p13 961-x
2   6129          Phone 5X    phone nokia     n_41s
3   6210          Friezer     agd   samsung   asfb1145-ssd          # found match
                                                                  it has the same
                                                                  `Supplier Code`


上面的ID被分配给Catalog Code。除VARCHAR外,所有字段均为ID。可能是空的。

我想做什么:

如果Catalog Code = 6083之一相同,则选择例如Catalog Codes并获取所有其他Supplier Codes

所以我应该得到:Catalog Code = 6210(最后一行),因为它与Supplier Code(第一行)具有相同的6083

我可怜的尝试:

SELECT a.*
  FROM `TABLE` a
  WHERE EXISTS
        (SELECT 1
            FROM `TABLE` b
            WHERE b.`Catalog Code` = '6083'
            AND (
                  a.`Supplier Code` NOT IN ('')
              AND a.`Supplier Code` IN b.`Supplier Code`
                )
        )


需要设计改进

我的实际数据库有10万多行。我觉得数据库设计需要改进,但是哪些需要改进?

INDEXESPRIMARY KEY,第二个具有FOREIGN KEY的数据库?

最佳答案

我会这样写查询:

select t.*
from t
where t.supplier_code in (select t2.supplier_code
                          from t t2
                          where t2.catalog_code = '6083'
                         );


您的代码很奇怪。为什么会有not in ('')?这是多余的。然后在第二个in上,您需要一个列表,而不是列值。实际上,只需=就足够了。

为了提高性能,您需要在t(catalog_code, supplier_code)上建立索引。

关于mysql - SQL选择具有相同列值的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36268768/

10-12 18:34