2011-03-21 109 views
1

问候!我在创建引用多个表的查询时遇到困难。我是SQL新手,联接困扰着我。我瞎了Google的搜索范围后,发现Joining tables in SQL让我更接近我想成为的地方!我创建的查询没有做我想要的。我有两个表:MySQL多表查询

disp_profile 
    disp_id* name  address  zip 
    0001  Profile1 SomeAddress1 11111 
    0002  Profile2 SomeAddress2 22222 
    0003  Profile3 SomeAddress3 33333 

zipcode 
    zip_code* state  city   county 
    11111  CA  City1  County1 
    22222  WA  City2  County2 
    33333  NV  City3  County3 

什么,我试图做的是从邮政编码抢市,州,县当zipcode.zip = disp_profile.zip(由变量State过滤)。理想的情况下返回是这样的:

dispId dispName  dispAddress  dispZip zipState zipCounty zipCity zipCode 
    001  Profile1  SomeAddress1 11111  CA   County1  City1 11111 
or 
    002  Profile2  SomeAddress2 22222  WA   County2  City2 22222 


SELECT 
    dp.disp_id AS dispId, dp.name AS dispName, dp.address1 AS dispAddress1, dp.zip AS dispZip, zc.state AS zipState, zc.county AS zipCounty, zc.city AS zipCity, zc.zip_code AS zipCode 
FROM 
    disp_profile dp 
INNER JOIN 
    zipcodes zc 
ON 
    dp.zip = zc.zip_code 
WHERE 
    dp.state = 'CA' 

我知道这可能不是去了解这一点的最好方式,但我认为最好单独存放东西VS每个项目的冗余信息。 disp_profile中的数据集大约有1000条记录,zip_codes大约为30,000条。使用子查询可以更轻松地完成这项工作吗?谢谢你的时间!

+0

你的输出似乎很好!我不确定什么是错误,你想要什么结果? – rkg 2011-03-21 07:59:01

回答

1

不,你做得很好。这就是加入的地方,这里不需要使用子查询。你可以,但它不会更好地执行(MySQL查询优化器甚至可能会将它转换为内部连接)。

如果您担心速度:把字“解释”在你的SELECT语句的前面,看看MySQL是这样做的:

EXPLAIN SELECT 
    dp.disp_id AS dispId, dp.name AS dispName, dp.address1 AS dispAddress1, dp.zip AS dispZip, zc.state AS zipState, zc.county AS zipCounty, zc.city AS zipCity, zc.zip_code AS zipCode 
FROM 
    disp_profile dp 
INNER JOIN 
    zipcodes zc 
ON 
    dp.zip = zc.zip_code 
WHERE 
    dp.state = 'CA' 

它会告诉你如何执行你的发言。在这里粘贴输出,如果你想我们帮助解释:)

+0

感谢您的意见。该查询是正确的,但问题是我的邮政编码数据不完整。菜鸟错误!非常感谢您的宝贵时间! – Antiartificial 2011-03-21 21:25:03

0

这对我来说看起来没问题,至少乍一看。我更喜欢老派的方式:

select dp.disp_id AS dispId, 
     dp.name AS dispName, 
     dp.address1 AS dispAddress1, 
     zc.state AS zipState, 
     zc.county AS zipCounty, 
     zc.city AS zipCity, 
     zc.zip_code AS zipCode 
from disp_profile dp, 
     zipcodes zc 
where dp.state = 'CA' 
    and dp.zip = zc.zip_code 

但是这只是一个风格问题(并使用DBMS有一个非常聪明的优化器 - 的MySQL是否匹配我的选择的DBMS,我不能评论(但我怀疑它))。

的一个变化我作出(和你应该)是只得到了邮政编码的一个。从dpzc获得该字段是多余的,因为它们因加入而相同。

+0

有趣的是,当我使用这种JOIN风格时,我得到[使用旧语法讲授](http://stackoverflow.com/questions/5291116/selecting-with-two-references-to-same-table/5291142#5291142 );) – Konerak 2011-03-21 08:10:25

+0

我只是发现旧的语法更容易理解,但这可能是因为我实际上必须使用所有那些正确的,外部的,颠倒的,略微倾斜的连接的次数,我可以指望一只脚的手指:-) – paxdiablo 2011-03-21 08:13:11

+0

Paxdiablo,感谢您的解决方案。它有效,但是错误完全在于我的结局。我拥有的邮政编码数据不完整,并解释了这种时髦的行为。非常感谢您的宝贵时间! – Antiartificial 2011-03-21 21:25:34