2012-07-19 63 views
0

我有以下查詢,其中列出所有帳戶與匹配的Facebook帳戶 - 問題是,有時在Facebook表中有多個匹配連接,然後我們有即使ac.id AS id應該是唯一的主鍵,重複的行也會被重複返回。加快sql查詢並修復連接

SELECT ac.id AS id 
    , ac.first_name 
    , ac.last_name 
    , ac.email 
    , ac.company_name 
    , upd8r_facebook_accts.id AS fb 
FROM upd8r_user_accts ac 
LEFT OUTER JOIN upd8r_facebook_accts 
    ON ac.id = upd8r_facebook_accts.user_id 
WHERE ac.`rfid` = '' 
AND ac.last_name != '' 
AND ac.`owner_id` = '121' 
ORDER BY ac.`last_name` ASC 

正在返回兩個問題重複行(我認爲它的時候有超過一排facebook的表匹配upd8r_user_accts.id。和查詢需要10秒跑......我有一個指數在upd8r_user_accts.id想這可能有幫助,但它並沒有

+0

請嘗試GROUP BY ON upd8r_facebook_accts.user_id字段 – 2012-07-19 08:15:42

+1

索引應位於外鍵upd8r_user_accts.user_id上。另外,您的速度問題可能與rfid,owner_id和last_name字段有關,您甚至可以通過 – Giuseppe 2012-07-19 08:18:57

+0

向我們顯示執行計劃? (使用EXPLAIN infront運行查詢) – 2012-07-19 08:27:58

回答

0

提示:在列

  • 賺指數附帶ONWHERE

  • 變化SELECT通過SELECT STRAIGHT JOIN

0

由於upd8r_user_accts.id是主鍵 - 添加索引到該列將不利於事宜,是多餘的。 您的查詢結果表明一些用戶擁有多個Facebook帳戶。 你沒有說明數據類型,如果id列(一個或多個),但你可以嘗試這樣的事情..

SELECT ac.id AS id, ac.first_name, ac.last_name, ac.email, ac.company_name, upd8r_facebook_accts.id AS fb 
FROM upd8r_user_accts ac 
LEFT OUTER JOIN upd8r_facebook_accts ON ac.id = upd8r_facebook_accts.user_id 
WHERE ac.`rfid` = '' 
AND ac.last_name != '' 
AND ac.`owner_id` = '121' 
AND upd8r_facebook_accts.id = (SELECT MAX(ufa.id) FROM upd8r_facebook_accts ufa WHERE ufa.user_id = ac.id) 
ORDER BY ac.`last_name` ASC 

這將心目中顯示每個用戶,但只承擔一行行它的效果刪除可能不是你想從結果中刪除的那些。 它還假定您可以在Id列上執行MAX功能。