2017-05-07 73 views
0

如何從另一個表格獲取一行信息,而無需每個循環都有SELECTPHP從另一個表格獲取信息

//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個帖子,並且每個帖子都是由其他用戶發佈的。我需要獲取發佈帖子的用戶的全名。現在,我需要SELECT 1000次,因爲那1000個用戶。現在看起來效率很低。我怎樣才能讓它變得更好?

我聽說加入可能有效嗎?有什麼解決方案?

+0

您在詢問Performance。當這樣一個問題出現時,我總是覺得有必要鏈接這個好文章:http://ericlippert.com/2012/12/17/performance-rant/ 那麼是否存在需要解決的實際問題?瓶頸究竟在哪裏?這個數據有多大可能會改變(你能緩存它)嗎? – Christopher

+0

@Christopher想象一下,如果我有1000個帖子,並且每個帖子都是由其他用戶發佈的。我需要獲取發佈帖子的用戶的全名。現在,我需要爲這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,然後在添加或刪除帖子時清除緩存。這樣,每次需要這些數據時都不需要打你的分貝。

+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