2009-10-19 100 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