原油的方式把它到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