2012-04-08 15 views
1

私は、MySQLのクエリではかなりシンプルな1対多型結合を持っています。この場合、私は左のテーブルで結果を制限したいと思います。例えばLIMITの最も効率的な方法はJOINですか?

は、のは、私がaccountsテーブルとcommentsテーブルを持っている、と私はそれぞれのaccountsおよび関連するすべてのcomments行から100行を引くしたいとしましょう。

これを行うには、単にFROM accountsを選択するのではなく、FROM句でサブを選択するしかありません。ここに私の現在の考えです:私は、サブ選択ある種の操作を行う必要がある時はいつでも、しかし

SELECT a.*, c.* FROM 
    (SELECT * FROM accounts LIMIT 100) a 
    LEFT JOIN `comments` c on c.account_id = a.id 
    ORDER BY a.id 

それが何か間違ったことをやっているように、私の中間レベルのSQLの知識が感じています。

これを行うには、より効率的な、またはより速い方法がありますか、これはかなり良いですか?ところで

...

これは私が答えとしてで大丈夫れ、これを行うための絶対的な最も簡単な方法かもしれません。私は、スピードの面で上記の声明と潜在的に競合する可能性のある別の方法があるかどうかを判断しようとしています。

+0

正常に動作しますか? :) –

+0

それは確かに動作します...しかし、もし私がすることができれば/私がすることができるかわからないので、私は "よく"わからない。私は自分の選択肢を見つけようとしているだけで、テストを実行できます。 – johnnietheblack

+1

さて、私には大丈夫です。私は現時点で別のクエリを持っていません:) –

答えて

1

私には完璧に見えます。

上記のクエリから100行以下または100行以上を受け取ってもよいかどうかは疑問です。 accountsテーブルの特定の行に対して、commentsテーブルに行がない場合は、100行未満になるためです。同様にaccountsテーブルの行のテーブルにcommentsテーブルに複数の一致する行がある場合、100を超える行が表示されることがあります。

参照:How can I optimize this query, takes more than a min to execute

+0

返される行の数本当に問題ではありません...このケースで私が本当に気にする返済口座の数です。 – johnnietheblack

1

いいえ、クエリは正しく、まさにそのとおりです。あなたはa.*c.*の代わりにフィールドをフィルタリングしたいかもしれません。

+1

'a。*'と 'c。*' ...を実際に使用しないことに完全に同意します。実際には、選択する列の詳細が入ります。ちょっと質問に怠けています:) – johnnietheblack

関連する問題