2012-06-20 56 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等

而且用戶表如下所示:

ID,姓名,圖片等

其中來自social_networks表的user_id與用戶表中的id匹配。每個用戶在social_networks表中可以有多行。

我試圖抓住的是用戶表和社交網絡表中各行的整行。我寧願在單個查詢中執行此操作。

+1

沒有看到表格的結構,這很難說。 – andrewsi

+1

「社交網絡」表的結構是什麼? –

+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

所以,你可以通過相同的ID這樣做

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查詢中完成。