原油道にそれを置くために:PHPで私のような配列をループ、何かができるよう
name | post
john | about me...
john | about my pets
....
は、私はより多くの、私が一緒にグループ化されたポストのすべてを持っている構造を探していますPHPの配列に: - GROUP_CONCATを使用して
$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'];
}
あなたは以下行うことができますが、それはユーザーのためのポストの出力の大きさに制限され、実際には何も解決しない(と場合の問題を持っているでしょう任意のポストを含む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のシリアライズされた配列としてポストの配列を構築するために、上記のバリエーションを使用することができますあなたは本当にあなたに望んでいた場合。私は以前これを行っていましたが、例外的な状況下でのみ(そして文字列を配列することでエラーを避けるのがずっと難しくなりました)。私は確かに従来の方法でそれほど簡単に対処されている何かのためにそれをお勧めしません。
EDIT
ので、これをアップノック退屈していました。これは、深刻なコードを使用するのではなく、シリアライズされた配列を返すことがどれほど厄介であるかを示すためのものです。それは、維持するのは悪夢で、おそらく実行が非常に遅いです。有効なシリアライズされた配列を提供できないケースがなければ、私は驚くでしょう。これを使う前に、max group concatの長さを設定する必要があることに注意してください(例えば、SET SESSION group_concat_max_len = 1000000;またはsillier)。
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