2016-11-18 52 views
0

我有一個用戶和職位表:使用連接並將連接結果放入數組中?

用戶

id | name 

帖子

id | post | user_id (fk) 

我想所有的用戶與他們的職位:

SELECT users.name, posts.post FROM users LEFT JOIN posts ON user.id posts.user_id 

從以上查詢我得到單獨的結果,每個帖子與重複的用戶通知例如,

name | post 
john | about me... 
john | about my pets 
.... 

我更想找一份我都組合在一起的職位的結構,所以在PHP中,我可以通過數組循環,是這樣的:

[0]=> array(2) { ["name"]=> string(4) "john" ["posts"]=> array(22){....} 
+2

什麼問題?循環訪問數據並生成所需的數組。應該是微不足道的。 –

+0

是的,我該怎麼做?沒有辦法只在sql中做到這一點? – panthro

+1

雖然有辦法可以做到這一點,但它們是非常可怕的黑客。遠比使用php做這件事更困難,而且可能遠遠不如使用php更可靠和慢得多。 – Kickstart

回答

0

原油的方式把它到PHP中的數組: -

$sql = "SELECT users.name, posts.post 
     FROM users 
     LEFT JOIN posts 
     ON user.id posts.user_id 
     ORDER BY users.name, posts.post"; 

$db->query($sql) or die($db->error()); 

$out_array = array(); 

while($row_item = $db->fetch_assoc()) 
{ 
    $out_array[$row_item['name']][] = $row_item['post']; 
} 

使用GROUP_CONCAT你可以做下面的,但它是在崗位的輸出,適用於用戶規模的限制,並沒有真正解決任何(如果將有問題任何後期容器d分隔字符串,在這種情況下爲#〜#)。

$sql = "SET SESSION group_concat_max_len = 1000000; 

$db->query($sql) or die($db->error()); 

$sql = "SELECT users.name, GROUP_CONCAT(posts.post SEPARATOR '#~#') AS out_post 
     FROM users 
     LEFT JOIN posts 
     ON user.id posts.user_id 
     GROUP BY users.name 
     ORDER BY users.name"; 

$db->query($sql) or die($db->error()); 

$out_array = array(); 

while($row_item = $db->fetch_assoc()) 
{ 
    $out_array[$row_item['name']] = explode('#~#', $row_item['out_post']); 
} 

如果你真的想要你可以使用上述變化來手動建立一個PHP的序列化數組的帖子數組。我之前做過這些,但只有在特殊情況下(並且有一串字符串使得避免錯誤變得更難)。我肯定不會推薦它用於以傳統方式很容易應對的事情。

編輯

很無聊,所以敲了這個。這更多地向您展示返回一個序列化數組而不是一段嚴重的代碼是多麼可怕。這將是一場噩夢,並且執行起來可能非常緩慢,如果不存在無法提供有效序列化數組的情況,我會感到驚訝。請注意,在使用此設置之前,您需要將最大組連續長度設置爲愚蠢(即,類似於SET SESSION group_concat_max_len = 1000000;甚至更​​糟糕)。

SELECT CONCAT('a:', COALESCE(COUNT(sub2.name), 0), ':{', GROUP_CONCAT(user_posts SEPARATOR ''), '}') 
FROM 
(
    SELECT users.name, 
      CONCAT('s:', LENGTH(users.name), ':"', users.name, '";a:', COALESCE(COUNT(sub1.user_id), 0), ':{', COALESCE(GROUP_CONCAT(all_fields ORDER BY counter SEPARATOR ''), ''), '}') AS user_posts 
    FROM users 
    LEFT OUTER JOIN 
    (
     SELECT user_id, 
       @cnt:=if(@prev_id != user_id, 0, @cnt + 1) AS counter, 
       CONCAT('i:', @cnt, ';s:',LENGTH(post),':"', post, '";') AS all_fields, 
       @prev_id := user_id 
     FROM posts 
     CROSS JOIN (SELECT @cnt:=0, @prev_id:=0) sub99 
    ) sub1 
    ON sub1.user_id = users.id 
    GROUP BY users.name 
) sub2 
0
$result=mysql_query("SELECT users.id,users.name, posts.post FROM users LEFT JOIN posts ON user.id posts.user_id"); 
$responce=array(); 
while($row=mysql_fetch_assoc($result)){ 
$responce[$row['id']]['name']=$row['name']; 
$responce[$row['id']]['posts'][]=$row['name']; 
} 
foreach($responce as $array){ 
$data[]=$array; 
} 
echo json_encode($data); 
0

我希望這給你的想法做你想做什麼。拋光它,你會很好。我曾在一個項目中做過一次工作

$usersPostsArray = array(); // Multi dimensional array to store the users and their posts 
$usersQuery = "select distinct name from users"; 
$result = mysqli_query($mysqli,$usersQuery); 
//First loop through the users 
while ($row = mysqli_fetch_assoc($result)){ 
    $postsQuery = "select * from posts where user_id = $row[id]"; // Select based on the user 
    $postresult = mysqli_query($mysqli,$postsQuery); 
    //Then loop through the posts based on the user 
    while ($postrow = mysqli_fetch_assoc($postresult)){ 
     array_push($usersPostsArray, $row['name'], $postrow['post']); 
    } 

} 

// Manipulate your array to get what you want 
+0

抱歉,嵌套循環幾乎不是解決方案 – e4c5