SQL选择具有相同列值的行

时间:2016-03-28 18:39:32

标签: mysql sql database-design

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

数据库样本

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 IF 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`
                )
        )

需要改进设计

我的真实数据库超过 100 000行。我觉得数据库设计需要改进但是哪些?

INDEXESPRIMARY KEY,第二个数据库FOREIGN KEY

2 个答案:

答案 0 :(得分:0)

我会更像这样编写查询:

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)上的索引。

答案 1 :(得分:0)

对于这个特殊的问题,你如何使用2表。

1)包含目录代码详细信息。(将目录代码保留为主键)

2)供应商详细信息(将ID保留为主键-1,2,3)

3)目录代码和供应商代码ID映射(两个表中的外键)..都是整数值,因此比较会使查询更快。