0

次のクエリがあります。これは、Facebookアカウントが一致するすべてのアカウントを一覧表示します。問題は、Facebookテーブルに結合に一致する行が複数ある場合があり、ac.id ASを使用しても、重複する行が繰り返されることがあります。 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'
ORDER BY ac.`last_name` ASC 

2つの問題は、重複する行が返されることです(Facebookテーブルにupd8r_user_accts.idに一致する行が複数ある場合です。クエリの実行には10秒かかります...upd8r_user_accts.idにインデックスがあります。助けてください、しかしそれはしていません

4

2 に答える 2

0

ヒント:

  • ONまたはに付属する列にインデックスを作成するWHERE

  • SELECTによって変更SELECT STRAIGHT JOIN

于 2012-07-19T08:30:12.783 に答える
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

これは、ユーザーごとに1つの行のみを表示する効果がありますが、削除する行は、結果から削除したい行ではない可能性があることに注意してください。また、Id列でMAX関数を実行できることも前提としています。

于 2012-07-19T08:40:52.023 に答える