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

上記のクエリを繰り返したユーザーに通知すると、各投稿ごとに別々の結果が得られます例えば、

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

何が質問ですか?データをループし、必要な配列を生成します。簡単なはずです。 –

+0

ええ、どうすればいいですか? SQLでのみこれを行う方法はありませんか? – panthro

+1

これを行う方法はありますが、それは非常に恐ろしいハッキングです。 phpでやっているよりもはるかに難しく、また、PHPを使って実行するよりはるかに信頼性が低く、はるかに遅くなる可能性があります。 – Kickstart

答えて

0

原油道にそれを置くために: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 
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

関連する問題