2012-06-20 3 views
1

У меня есть две таблицы, одна из которых «пользователи», а одна из них - «социальные сети». Я хочу захватить данные из обоих в определенном формате, а таблица социальных сетей имеет user_id в качестве столбца.Сложный для многих запросов mysql

Я хочу, чтобы в конечном итоге с чем-то вроде

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 и т.д.

И пользовательская таблица выглядит следующим образом:

ид, имя, картинка и т. д.

Где user_id из таблицы social_networks соответствует id из таблицы users. Каждый пользователь может иметь несколько строк в таблице social_networks.

То, что я пытаюсь захватить, - это вся строка из таблицы пользователей и каждой соответствующей строки из таблицы социальных сетей. Я бы предпочел сделать это в одном запросе.

+1

Не видя структуры таблиц, это довольно сложно сказать. – andrewsi

+1

Какова структура таблицы "social networks"? –

+0

Что вы подразумеваете под «всеми данными из строки fb»? Все ли связанные с fb строки из таблицы социальной сети? – ISBL

ответ

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 
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 = -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++; 
} 
+0

В этом случае, если бы у меня был один пользователь с несколькими строками в таблице SN, я бы получил несколько строк, где информация пользователя была дублирована. Я надеюсь собрать пользователя и соответствующие строки SN в формате, описанном выше. –

+0

Извините, я ужасно неправильно понял. Надеюсь, это больше поможет. –

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); 
+0

Я пытаюсь достичь этого, используя один запрос, я не хочу делать слишком много соединений с БД. –

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.

Смежные вопросы