2011-01-14 10 views
0
SELECT mem.name, 
      mem.regdate, 
      stat.level 
     FROM stats AS stat 
INNER JOIN members AS mem 
    WHERE stat.id = mem.id 
     AND mem.ref = {$members['id']} 

statsおよびmembersテーブルのインデックスはidです。しかし、クエリを実行すると、statsテーブルのすべての行がチェックされます(membersテーブルでは1つしかかかりません)。私が間違っていることは何ですか?ありがとう。このクエリをさらに最適化する方法は?

答えて

3

使用正しいANSI-92 JOIN構文を - 基準のJOINはON句で指定されています

SELECT mem.name, 
     mem.regdate, 
     stat.level 
    FROM stats AS stat 
    JOIN members AS mem ON mem.id = stat.id 
WHERE mem.ref = {$members['id']} 

結合条件がなければ、MySQLはデカルト積を返した後、それらの結果にWHERE句を適用します。他のどのデータベースでも、あなたが提供したクエリの構文エラーがあると言えます。

また、INNERキーワードはオプションです。

+0

これは、数週間プログラムしていないときに起こることです...ありがとう –

+0

それはまだ 'stats'行をチェックします。 –

+0

@hey: 'id'カラムはそれぞれのテーブルの主キーです。 CREATE TABLEステートメントとEXPLAIN PLAN出力は役に立ちます。 –

0

追加情報については、メインテーブル(この例ではメンバ)から選択し、統計情報を取得してみてください。 ONを使用して、統計がメンバーにどのように接続されているかを定義し、WHEREを使用してメンバー表の結果を制限します。

SELECT mem.name, mem.regdate, stat.level 
FROM members AS mem 
INNER JOIN stats AS stat 
    ON stat.id = mem.id 
WHERE mem.ref = {$members['id']}

それはINNERはあなたが(メンバーに加入、統計から選択する)だけでなく、それを好転させることができますが、これはおそらくあなたが特定のメンバーを見ている与えられた、より理にかなって、JOINですので。

関連する問題