2017-05-07 12 views
0

SELECT各ループを実行することなく、別のテーブルから行の情報を取得するにはどうすればよいですか?PHP別のテーブルから情報を取得

//get posts from "posts" table 
$stmt = $dbh->prepare("SELECT * FROM posts WHERE user_id = :user_id"); 
$stmt->bindParam(':user_id', $userId); 
$stmt->execute(); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

foreach ($result as $row) { 
    echo $row['post']; 

    //get poster's full name from "users" table 
    $stmt = $dbh->prepare("SELECT * FROM users WHERE user_id = :user_id"); 
    $stmt->bindParam(':user_id', $row['poster_id']); 
    $stmt->execute(); 
    $result2 = $stmt->fetchAll(PDO::FETCH_ASSOC); 

    foreach ($result2 as $row2) { 
     echo $row2['full_name']; 
    } 
} 

このコードをより効率的かつ高速にするにはどうすればよいですか?

私は1000の投稿があり、それぞれが別のユーザーによって投稿されたとします。投稿を投稿したユーザーのフルネームを取得する必要があります。今は1000人のユーザーのために、私はSELECTに1000回する必要があります。今は非常に非効率なようです。どうすればいい?

私は参加する可能性があると聞きましたか?解決策は何ですか?

+0

パフォーマンスについて質問しています。私はいつも、このような質問が現れたときにこの良い記事をリンクする必要性を感じます:http://ericlippert.com/2012/12/17/performance-rant/ あなたは解決する必要がある実際の問題はありますか?どこがボトルネックですか?このデータはどのくらい変わるでしょうか(キャッシュできますか)? – Christopher

+0

@Christopher私は1000の投稿があり、それぞれが別のユーザーによって投稿されたと想像してください。投稿を投稿したユーザーのフルネームを取得する必要があります。今は、1000人のユーザーのために「選択」する必要があります。今は非常に非効率なようです。どうすればいい? – baileyJchoi

+0

@MattiaDinosaurあなたは例を見せていただけますか? – baileyJchoi

答えて

4
SELECT * FROM posts 
JOIN users ON posts.user_id = users.id 
WHERE posts.user_id = :user_id. 

あなたの投稿のクエリにユーザーテーブルを参加させる方が速いでしょう。

パフォーマンスを向上させるために何かできることは、クエリの結果をmemcacheのようなものにキャッシュし、投稿が追加または削除されたときにキャッシュをクリアすることです。そうすれば、このデータが必要になるたびにdbにヒットする必要はありません。

+0

でも、どのように変数にアクセスできますか? '$ row ['post']'や '$ row2 ['full_name']' – baileyJchoi

+0

からも同じです。結合されたクエリは、両方のテーブルの列を返します。 $ row2や内部ループは必要ありません。すべてが$行で利用可能になります。 –

+1

私はRyan Tiostoのソリューションに同意します。しかし、あなたはSQLの参加についての質問ではなく、もはやPHPほどです。スペルのためにPHP側を忘れてしまいます。 SQLを理解する前にPHPをコーディングすることはできません:https://www.w3schools.com/sql/sql_join.asp – Christopher

関連する問題