2011-08-20 60 views
0

我可以通过MySQL JOIN获得一些帮助吗?帮助mysql加入

基本上我有4个表,贸易商,streetaccounts(即与交易者相关联),recommendation_brokerages和建议。我需要从交易员表中获取所有交易者的姓名和电子邮件地址,其中交易员streetaccount.brokerage_id存在于recommendation_brokerages表和建议表中。

这是我的表的基本结构。

tbl_traders 
-------------------------------------- 
trader_id | trader_name | email 
-------------------------------------- 

tbl_streetaccounts 
-------------------------------------- 
trader_id | brokerage_id 
-------------------------------------- 

tbl_recommendation_brokerages 
-------------------------------------- 
recommendation_id | brokerage_id 
-------------------------------------- 

tbl_recommendations 
-------------------------------------- 
recommendation_id | published 
-------------------------------------- 
+0

你有什么这么远吗? (并且在超过30个问题后,您应该预期此评论) – Eddy

+0

您应该发布表格的完整定义,特别是主键和外键。我们只需要猜测关系。 – cope360

回答

2
select t.* from tbl_traders t 
inner join tbl_streetaccounts s on t.trader_id = s.trader_id 
inner join tbl_recommendation_brokerages rb on s.brokerage_id = rb.brokerage_id 
inner join tbl_recommendations r on t.recommendation_id = r.recommendation_id 

NB,人们普遍认为“没有用处”有描述键入一个前缀。这种从80年代开始的做法经常受到批评。

乔尔http://www.joelonsoftware.com/articles/Wrong.html

+0

如果他们有多个街道账户,这会不会多次返回交易者? – cope360

+0

@ cope360是的,它会。 't。*'之前的'distinct'应该可以解决这个问题。会比子查询快。 – Hogan

+0

比子查询还快?我的经验是,如果子查询不*引用rowdata(所以它对所有行计算一次,而不是每行计算一次),'NOT IN(SELECT ... WHERE ...)'通常会更快。 – Lucero

0

请参阅这篇文章的部分“我是匈牙利”假设tbl_recommendation_brokerages.recommendation_id是一个外键tbl_recommendations.recommendation_id,我们并不需要加入到tbl_recommendations

SELECT 
    t.trader_name, 
    t.email 
FROM 
    tbl_traders t 
WHERE 
    EXISTS (
     SELECT 
      * 
     FROM 
      tbl_streetaccounts acct, 
      tbl_recommendation_brokerages rec 
     WHERE 
      acct.brokerage_id = rec.brokerage_id 
      AND acct.trader_id = t.trader_id 
     )