2011-08-20 33 views
0

這是我的第一個問題,所以希望它是有道理的。php連接兩個表使用爆炸和一個字符串包含多個值

當一個字符串包含多個值時,如何使用php/mysql鏈接兩個表。

基本上,一個表是myMembers表,並且包含一個「friend_array」,其中多個ID存儲在一個字符串中。

其他表格包含我所有網站用戶發佈的列表(推文等)。

如何鏈接兩個表以顯示最新帖子的所有用戶的朋友帖子?

// myMember表

id, friend_array, 
1, 1,2 
2, 2,5,7 
. 
. 

//職位表

id, mem_id, post,  post_date 
1, 5,  PHP ole, 2011-08-11 11:30 
2, 2,  AJAX ole, 2011-08-12 13:10 

希望這是有道理的。謝謝大家提前

回答

1

我會重組表,如果有可能,讓你得到一個結構類似以下內容:

帖子

id, mem_id, post,  post_date 
1, 5,  PHP ole, 2011-08-11 11:30 
2, 2,  AJAX ole, 2011-08-12 13:10 

其中id是主鍵

mymembers

id, name 
1, member1 
2, member2 

其中id是主鍵

memberconnections

id, mem_id, friendid 
1, 1, 1 
2, 1, 2 
3, 2, 2 
4, 2, 5 
5, 2, 7 

其中id是主鍵,friendid是外鍵

這樣你可以很容易地創建一個查詢,以獲得您想要的信息。

使用這個n的查詢替代PHP的東西是fatster和更好的方式來做到這一點。

+0

+1。我還建議你重新構建它並使用鏈接表,你目前的設計是非常有問題的。 – shesek

0

如果你想保留你的數據庫結構,你可以使用FIND_IN_SET()和一個子查詢。這並不在真正的IN條款分割的CSV值一樣,但有同樣的效果:

SELECT * 
    FROM posts 
WHERE FIND_IN_SET(mem_id, 
      (SELECT friend_array FROM myMember WHERE id=2) 
     ) 
0

如果我unstanding正確

mysql_query("SELECT * FROM POSTS WHERE mem_id IN(SELECT friend_array FROM myMember WHERE id=" . $id); 

其中$ id爲的標識你希望找到的朋友。

+0

這不起作用。 friend_array只是一個有多個ID的字符串,就像'WHERE mem_id IN'1,2,3' – shesek

0

你可以用PHP輕鬆完成。你甚至不需要爆炸。取決於你如何做到這一點;它的基礎是:

$q = mysqli_query("SELECT * FROM myMember WHERE id = " . $id); 
    while($info = mysqli_fetch_array($q)) { 
    $p = mysqli_query("SELECT * FROM posts WHERE mem_id IN(".$info['friendArray'].") ORDER BY post_date DESC"); 
    while($pinfo = mysqli_fetch_array($p) { 
echo $pinfo['post_title']; // etc... 
} 
    } 

就算你不想做一個循環內的查詢,如果您有數百個職位的,在這種情況下,我覺得抓住相關信息並將其存儲在2個獨立的數組,然後運行一個foreach循環來減少密集度。

正常化您的數據庫也會不那麼密集...別人發佈了一條建議,以下/上面。