2016-11-18 51 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