原油的方式把它到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
什么问题?循环访问数据并生成所需的数组。应该是微不足道的。 –
是的,我该怎么做?没有办法只在sql中做到这一点? – panthro
虽然有办法可以做到这一点,但它们是非常可怕的黑客。远比使用php做这件事更困难,而且可能远远不如使用php更可靠和慢得多。 – Kickstart