2016-12-05 5 views
0

があった場合、私は以下のような2つのテーブルを持っている複数のクエリ対のJOIN:はLIMIT 5

// posts 
+----+---------+------------------+-----------+ 
| id | title |  content  | author_id | 
+----+---------+------------------+-----------+ 
| 1 | title1 | content1   | 123  | 
| 2 | title2 | content2   | 456  | 
| . | .  | .    | .   | 
| . | .  | .    | .   | 
| . | .  | .    | .   | 
+----+---------+------------------+-----------+ 

// users 
+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | Jack | 
| 2 | Peter | 
| . | .  | 
| . | .  | 
| . | .  | 
+----+-------+ 

私は以下のような5つのポスト選択したい:私もの名前を取得する必要があり

SELECT * FROM posts WHERE 1 ORDER BY id LIMIT 5 

投稿者だから私はこのようなJOINを使用することによってそれを行うことができます。

SELECT * FROM posts WHERE 1 ORDER BY id LIMIT 5 
// storing results in a PHP array named $results 
foreach($results as $result) { 
    SELECT name FROM users WHERE id = $result['author_id'] 
    // storing results in a PHP array named $names 
} 
// combining $names and $results to make expecting result 

ので、そのアプローチは、巨大なデータセットのために、より効率的である:

SELECT p.*, u.name 
FROM posts p 
JOIN users ON p.author_id = u.id 
WHERE 1 
ORDER BY id 
LIMIT 5 

は、私はこのような他の方法でそれを行うことができますか?つまり、LIMITの前にJOINが発生しますか?もしそうなら、私はPHPでこれを行うのが速くなると思います、間違っていますか?

答えて

1

エンジンは独自の実装を指定することができますが、MySQLはテーブル全体を読み取ることはありません:LIMITと同時にJOINを行い、5行が見つかるまで1行ずつ取り出します。

+0

ああ、私は参照してください。+1 – stack

+0

@stack +1に感謝しますが、あなたの質問に適切に答えた場合、回答を受け入れることができます。 :) –

0

MySQLのエンジン:のInnoDBは、それが5行を発見するまで行ずつ取り出し、をJOINと同時に動作するその後LIMITテーブルの行レベルのロックを使用します。