2009-10-19 103 views
1

如果我删除最后一个JOIN行,但是我不确定为什么它不起作用。 最后两条JOIN语句试图从同一个表中的不同行中获取数据('meta_value'),其名称只能通过读取同一个表中的另一个相应列('meta_key')才能找到。所有这一切都加入了所有3个表中常见的user_id。SQL:加入3个表格,需要也加入第三个自己

SELECT mod_membership.uid, 
     mod_membership.wp_user_id, 
     mod_membership.status, 
     mod_membership.last_login, 
     mod_membership.membership_type, 
     mod_membership.membership_expiration, 
     wp_users.user_login, 
     wpm_a.meta_value AS first_name 
    FROM mod_membership 
    JOIN wp_users ON wp_users.ID = mod_membership.wp_user_id 
    JOIN wp_usermeta AS wpm_a ON wpm_a.user_id = mod_membership.wp_user_id WHERE wpm_a.meta_key = 'first_name' 
    JOIN wp_usermeta AS wpm_b ON wpm_b.user_id = mod_membership.wp_user_id WHERE wpm_b.meta_key = 'last_name' 

我怎样才能得到第三JOIN工作,或使用其他方法来获取这些结果的一个结果集,在USER_ID分组?

+0

只是想感谢大家这样的快速答复和解决方案。你们都很帮忙。 – Jeff 2009-10-19 20:57:22

回答

4

试试这个:

SELECT m.uid, m.wp_user_id,m.status, 
    m.last_login,m.membership_type, 
    m.membership_expiration, 
    u.user_login, 
    f.meta_value first_name, 
    l.meta_value last_name 
From mod_membership m 
    Join wp_users u 
     On u.ID = m.wp_user_id 
    Left Join wp_usermeta f 
     On f.user_id = m.wp_user_id 
     And f.meta_key = 'first_name' 
    Left Join wp_usermeta l 
     On l.user_id = m.wp_user_id 
     And l.meta_key = 'last_name' 

要回答你的问题,你的语法是不工作的原因是,首先,只能有一个where子句每SQL语句。您不能为每个连接添加where子句,这就是“On”连接的用途......

其次,Where子句中的条件不会应用到生成最终结果集为止,而连接条件被评估为“一路走来”,因为每个中间结果集都是从每个连续的连接语句构造而来的。

+0

这是完美的,并且在结果集中同时获得first_name和last_name。感谢Charles。 – Jeff 2009-10-19 20:55:16

1

交易所凡和

SELECT mod_membership.uid, 

mod_membership.wp_user_id, 

mod_membership.status, 

mod_membership.last_login, 

mod_membership.membership_type, 

mod_membership.membership_expiration, 

wp_users.user_login, 

wpm_a.meta_value AS first_name 

FROM mod_membership 

JOIN wp_users ON wp_users.ID = mod_membership.wp_user_id 

JOIN wp_usermeta AS wpm_a ON wpm_a.user_id = mod_membership.wp_user_id AND wpm_a.meta_key = 'first_name' 

JOIN wp_usermeta AS wpm_b ON wpm_b.user_id = mod_membership.wp_user_id AND wpm_b.meta_key = 'last_name' 
3

据我所知,你并不需要一个第三加盟 - 它看起来像你试图做到这一点:

SELECT DISTINCT mod_membership.uid, mod_membership.wp_user_id, 
mod_membership.status, mod_membership.last_login, 
mod_membership.membership_type, mod_membership.membership_expiration, 
wp_users.user_login, wpm_a.meta_value AS first_name 

FROM mod_membership 
INNER JOIN wp_users ON wp_users.ID = mod_membership.wp_user_id 
INNER JOIN wp_usermeta AS wpm_a ON wpm_a.user_id = mod_membership.wp_user_id 
WHERE (wpm_a.meta_key = 'first_name' OR wpm_a.meta_key = 'last_name') 

的原因是您的原始查询不起作用,因为您只能拥有一个WHERE子句。

+0

我想你应该在'WHERE'语句中使用'AND'而不是'OR'。 – 2009-10-19 20:49:22

+0

'wpm_a.meta_key ='first_name'或者wpm_a.meta_key ='last_name''表示两个值都匹配 - OP中的JOIN表示** BOTH **必须存在才能匹配。 – 2009-10-19 20:52:13

+0

@Ivan&@rexem我不确定这是OP的意图......我会在编辑之前等待@Deca澄清。 – Greg 2009-10-19 20:54:44