1

「ユーザー」と「ソーシャルネットワーク」の2つのテーブルがあります。特定の形式で両方からデータを取得したいのですが、ソーシャル ネットワーク テーブルには列として user_id があります。

私はのようなもので終わりたい

array{
    0 => array{
        name => "Bob",
        id => 1,
        facebook => array{ <all data from the fb row> },
        twitter => array{ <all data from the tw row> },
        linkedin => array{ <all data from the li row> }
    },
    1 => array{
        name => "Jill",
        id => 2,
        facebook => array{ <all data from the fb row> },
        twitter => array{ <all data from the tw row> },
        linkedin => array{ <all data from the li row> }
    }
}

これは可能ですか?

わかりやすくするために編集します。

social_networks テーブルは次のようになります。

user_id、social_network、account_url など。

ユーザーテーブルは次のようになります。

ID、名前、写真など

social_networks テーブルの user_id は、users テーブルの id と一致します。各ユーザーは、social_networks テーブルに複数の行を持つことができます。

私が取得しようとしているのは、ユーザー テーブルの行全体と、ソーシャル ネットワーク テーブルのそれぞれの行です。これを単一のクエリで行うことをお勧めします。

4

4 に答える 4

2

mysql から直接行うことはできませんが、かなり簡単に行うことができます。擬似コードは次のとおりです。

// connect to database
// query for all users
// foreach user
  // add user to array
  // add user's fb info to array
  // add user's tw info to array
  // add user's li info to array

もう少し詳しく説明します (PDO を使用します。mysql_* が問題ないとは思わないため)。

<?php

// create a PDO object to connect to the db
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');

// get a basic list of users with their IDs and names
$query = $pdo->query('select user_id, name from users');

// prepare the final array that will hold it all
$users = array();

// loop through the users returned by the query
while($row = $query->fetch(PDO::FETCH_ASSOC)) {
  // make an array for this user with the basic data
  $user = array('id' => $row['user_id'], 'name' => $row['name']);

  // add fb data
  $user['fb'] = $pdo->prepare('select * from fb where user_id = :user_id')
    ->execute(array(':user_id' => $user['id']))
    ->fetch(PDO::FETCH_ASSOC);


  // add li data
  $user['li'] = $pdo->prepare('select * from li where user_id = :user_id')
    ->execute(array(':user_id' => $user['id']))
    ->fetch(PDO::FETCH_ASSOC);

  // add tw data
  $user['tw'] = $pdo->prepare('select * from tw where user_id = :user_id')
    ->execute(array(':user_id' => $user['id']))
    ->fetch(PDO::FETCH_ASSOC);

  // add new user to the full array
  $users[] = $user;
}

// do stuff with the $users array
于 2012-06-20T21:01:52.770 に答える
1

私の他の答えの代わりとして、これは1つのクエリですべてのデータを取得します:

select
  users.id,
  users.name,
  fb.account_url as 'facebook_account_url',
  li.account_url as 'linkedin_account_url',
  tw.account_url as 'twitter_account_url',
from
  users
  inner join social_network as fb on users.id = fb.user_id and fb.social_network = 'fb'
  inner join social_network as tw on users.id = tw.user_id and tw.social_network = 'tw'
  inner join social_network as li on users.id = li.user_id and li.social_network = 'li'

結果のデータは、質問で示したような多次元配列にはなりませんが、単一の MySQL クエリで実行されます。

于 2012-06-20T21:13:41.157 に答える
1

だからあなたは次のようなことができます

SELECT u.ID, u.Name, s.* FROM users u
INNER JOIN socialNetworks s ON u.ID = s.user_id
ORDER BY u.ID

そして、同一の ID をループして、ユーザーごとに配列を作成します。

$id = -1;
$i = 0;
$userArr = array();
while($row = mysqli_fetch_array($res))
{
    //parse row set user/SN info

    if($id != $row["ID"])
    {
        $tempUserArr = array();
        $id = $row["ID"];
        //set user and sn info to $tempUserArr
        $userArr[] = $tempUserArr;
    }
    else
    {
        $tempSN_arr = array();
        //set social network info to $tempSN_arr
        $userArr[$i][$row["sn_type"]] = $tempSN_arr;
    }
    $i++;
}
于 2012-06-20T20:57:21.610 に答える
1
$sql = "SELECT * FROM user";
$rows = mysql_query($sql);


$user_array = array()

while($record = mysql_fetch_array($orws){

   $new_array = array();
   $new_array['name']  = $record['name'];
   $new_array['id']  =$record['user_id'];
   $new_array['facebook'] = array(); //function or query to fill data
   $new_array['twitter'] = array();//function or query to fill data
   $new_array['linkedin'] = array();//function or query to fill data

     $user_array[]=$new_array;
}
print_r($user_array);
于 2012-06-20T20:57:32.007 に答える