2011-02-21 18 views
3

、順に参加:左が私はこのようなクエリを持って、MySQLの最適化

SELECT m...., a...., r.... 
    FROM 0_member AS m     
LEFT JOIN 0_area AS a ON a.user_id = (SELECT user_id 
             FROM `0_area` 
             WHERE user_id = m.id 
            ORDER BY sec_id ASC LIMIT 1) 
LEFT JOIN 0_rank as r ON a.rank_id = r.id 
    WHERE m.login_userid = '$username' 

アイデアが参加0_areaテーブルから最初の行を取得し、それゆえ試みたインナーです。ただし、期待どおりに動作していません。

0_areaと0_memberの間に、0_member.id = 0_area.user_id。しかし、0_area.user_idの複数の行があり、最小値のsec_idを持つ行が必要です。

お願いします。

+0

'sec_id'カラムは一意ですか? –

+0

@ Scrum Meister sec_idはユニークではありませんが、ユニークな作成は役に立ちますか? –

+0

@ jeremy-roy Nop、ちょうど尋ねる。 –

答えて

6
SELECT m...., a...., r.... 
    FROM 0_member AS m    
LEFT JOIN (SELECT user_id, min(sec_id) minsec 
      FROM `0_area` 
      GROUP BY user_id) g1 on g1.user_id=m.id 
LEFT JOIN 0_area AS a ON a.user_id = g1.user_id and a.sec_id=minsec 
LEFT JOIN 0_rank as r ON a.rank_id = r.id 
    WHERE m.login_userid = '$username' 
+0

ちょっとリチャード、それは働いています。偉大な人 !!! –