2017-09-06 33 views
0

這裏是我的表的名單和必要的列JOIN多個表上給人重複的記錄 - MySQL的

用戶ü

screen_name, 
country, 
status 

twitter_users_relationship TF。該表格有多個target_screen_name,每個screen_name

screen_name, 
target_screen_name, 
target_country, 
follow_status 

user_twitter_action_map TA

screen_name, 
action_name, 
action_status 

user_targeted_countries UTC。這個表有多個國家的每個screen_name

screen_name, 
country_name 

我想從twitter_users_relationship所有target_screen_name具有匹配的target_countryu.countryutc.country_name

我的查詢到目前爲止

SELECT u.screen_name, 
     u.country, 
     tf.target_screen_name, 
     tf.target_country, 
     ta.action_name, 
     ta.action_status, 
     utc.country_name 

FROM users u 
LEFT JOIN twitter_users_relationship tf 
    ON u.screen_name=tf.screen_name 
LEFT JOIN user_twitter_action_map ta 
    ON u.screen_name=ta.screen_name 
    AND ta.action_name='follow' 
    AND ta.action_status='active' 
LEFT JOIN user_targeted_countries utc 
    ON u.screen_name= utc.screen_name 
WHERE u.status = 'active' 
    AND tf.follow_status = 'pending' 
    AND tf.target_country != '' 
    AND tf.target_country IS NOT NULL 
    AND (utc.country_name=tf.target_country OR u.country=tf.target_country) 
    AND u.screen_name = 'my_screen_name'; 

但此查詢給我重複記錄在user_targeted_countries國家的每個條目。如果user_targeted_countries有3個縣,它將返回3個重複記錄。

請讓我知道什麼JOIN我需要使用user_targeted_countries才能得到想要的結果。

u.country可以比國家的不同之處utc.country_name

UPDATE - 如果我從WHERE條款刪除OR u.country=tf.target_country然後我得到的所有匹配target_screen_name不重複。但我不知道如何獲得與u.country=tf.target_country匹配的所有記錄?

+0

如果JOIN中使用了一對多或多對多關係,JOIN's就會知道給出重複的結果...通常,DISTINCT將有助於刪除重複項。 –

+0

這是正常的,還是我需要更多練習才能正確使用'JOIN'? – prograshid

+0

@RaymondNijland由於'country_name'列可能不同,因此Distinct在這裏不起作用。 – sagi

回答

2

取決於所需的業務邏輯..

先不論這個問題,你的查詢是錯誤的(無論是LEFT JOIN或條件)。當使用LEFT JOIN時,右表中的條件應爲,只有ON條款中指定了,這意味着您需要將tf.utc.上的所有條件移至ON子句。其次,您可以使用GROUP BY子句並選擇其中一個utc.country_name(如果您需要特定的答案,則不同的答案,如果沒關係,則在此列上使用MAX())。

+0

好的。將嘗試通過與'ON'條件。 但我不會喜歡使用GROUP BY,因爲我可能需要不同順序的記錄並可能刪除u.screen_name ='my_screen_name''條件。 – prograshid