2010-11-30 4 views
0

状況: 2つのテーブル、人名とその他のデータを格納している最初の人(Person)、電話番号を格納している2番目の(Phones)。 1人あたり複数の電話番号が存在する可能性があります(最初は別のテーブルを使用しています)。mysql最速2テーブルクエリ

目標:最後に私はこのようなPHPの配列を持っていると思いますように、すべてを選択します。

array 
(
'0' => array 
     (
     'name' => 'John Smith' 
     // other values from table Persons... 
     'Phones' => array('0' => '12345', '1' => '324343') // from Phones table 

     ), 
'1' => array 
     (
     'name' => 'Adam Smith' 
     // other values from table Persons... 
     'Phones' => array('0' => '645646', '1' => '304957389', '2' => '9435798') // from Phones table 

     ) 
); 

ETC.

Phones.person_id = Persons.id

何これを行うための最速の方法だろうか?プログラム実行時間の意味では最速であり、コーディング時間ではありません。私はシンプルなJOINを行うことができましたが、この場合は、電話機ごとに複数の重複した行が表示されます。つまり、私が何を意味するのかを見ても、同じ人のすべてのデータを繰り返し取得できます。だから私はPHP側で配列に取り組む必要があります。多分もっと良い方法がありますか?

答えて

0

最初に人を取得し、各電話番号を照会します。

$return = array(); 
$query = "SELECT `id`, `name` FROM `Persons`"; 
$person_results = mysql_query($query); 
if($person_results && mysql_num_rows($person_results)) { 
    while($person_row = mysql_fetch_assoc($person_results)) { 
    $person = array(); 
    $person['name'] = $person_row['name']; 
    $person['phone'] = array(); 
    $query = "SELECT `number` FROM `Phones` WHERE `person_id` = '{$person_row['id']}'"; 
    $phone_results = mysql_query($query); 
    if($phone_results && mysql_num_rows($phone_results)) { 
     while($phone_row = mysql_fetch_assoc($phone_results)) { 
     array_push($person['phone'], $phone_row['number']); 
     } 
    } 
    } 
} 
return $return; 
+0

これは、1つのSQLクエリを実行し、PHPで配列を並べ替えるよりも高速であることは間違いありません。 – chris

+0

あなたの返事をありがとうございますが、それは100k + mySQLのクエリになるでしょう、それはひどく非効率です。 – Rick

+0

あなたはそうです。私はJOINがうまくいくと思っています。そして、あなたはそのように結果を並べ替えることができます。結果を繰り返します。名前がバッファ配列にある場合は、その番号を追加します。そうでない場合は、名前をバッファに追加してから番号を追加します。 –

1

1つのクエリ。

関連する問題