2016-11-18 12 views
0

私は、次の表に含まれているMySQLデータベースがあります。そのように見えますMySQLは、サブ配列に2つの関連テーブルをフェッチ

Studentテーブル:

|------------------------------------| 
| studentId | studentName | school | 
|------------------------------------| 
| 1   | Student A | 1  | 
| 2   | Student B | 2  | 
| 3   | Student C | 2  | 
|------------------------------------| 

そしてSchoolテーブル:

|------------------------------| 
| schoolId | schoolName | desc | 
|------------------------------| 
| 1  | School A | ... | 
| 2  | School B | ... | 
| 3  | School C | ... | 
|------------------------------| 

PHPを使用して、私はすべての生徒の配列を取得し、それらの学校情報をサブ配列に含めようとしています。

Array 
(
    [0] => Array 
     (
      [studentId] => 1 
      [studentName] => Student A 
      [school] => Array 
       (
        [schoolId] => 1 
        [schoolName] => School A 
        [desc] => ... 
       ) 
     ) 
    [1] => Array 
     (
      [studentId] => 1 
      [studentName] => Student A 
      [school] => Array 
       (
        [schoolId] => 1 
        [schoolName] => School A 
        [desc] => ... 
       ) 
     ) 
    [2] => Array 
     (
      [studentId] => 1 
      [studentName] => Student A 
      [school] => Array 
       (
        [schoolId] => 1 
        [schoolName] => School A 
        [desc] => ... 
       ) 
     ) 
) 

私はこの

$studentsResult = $conn->query("SELECT * FROM STUDENT"); 
$studentsArray = $studentsResult->fetch_all(MYSQLI_ASSOC); 

$finalArray = array(); 

foreach ($studentsArray as &$student) { 
    $schoolSQL = "SELECT * FROM SCHOOL WHERE schoolId = ".$student['schoolId']; 
    $schoolResult = $conn->query($schoolSQL); 
    $schoolArray = $schoolResult->fetch_all(MYSQLI_ASSOC); 

    unset($student['schoolId']); 
    $student['school'] = $schoolArray[0]; 
    $finalArray[] = $student; 
} 
echo '<pre>'; print_r($finalArray); 

を行うことであることを達成することができました。しかし、私はこの方法は、私はすべての学生をループして実行していますので、大規模なデータベースのための最も効率的だとは思いません学校行を取得するためのクエリ。

私はSQLだけを使ってすべてを行うことができますか?

+0

よう

何かが同じ行に一緒に学校の情報や学生の情報を取得するために 'JOIN'を使用してください。次に、現在のようにループして同様の操作を実行してサブアレイを作成します。 –

答えて

1

参加を行い、生徒が変更されたときに生徒を追加するだけです。しかし、学生の学校の配列に学校の詳細を追加するだけです。この

<?php 

$studentsResult = $conn->query("SELECT a.studentId, 
             a.studentName, 
             b.schoolId, 
             b.schoolName, 
             b.desc 
           FROM STUDENT a 
           LEFT OUTER JOIN SCHOOL b 
           ON a.schoolId = b.schoolId"); 

$prev_student = 0; 
$studentsArray = $studentsResult->fetch_all(MYSQLI_ASSOC); 

$finalArray = array(); 

foreach ($studentsArray as &$student) 
{ 
    if ($prev_student != $student['studentId']) 
    { 
     $finalArray[] = array('studentId' => $student['studentId'] 
           'studentName' => $student['studentName'] 
           'school' => array()); 
     $prev_student = $student['studentId']; 
    } 
    $finalArray[key($finalArray)][] = array('schoolId ' => $student['schoolId'] 
              'schoolName ' => $student['schoolName'] 
              'desc ' => $student['desc']); 
} 

echo '<pre>'; print_r($finalArray); 
+0

ありがとうございます、私はあなたのJoin SQLクエリを使用しましたが、これはPHPループでは必要ありません。 '$ finalArray [] =配列( 'studentId' => $学生[ 'studentId']、 'studentName' => $の学生を[ 'studentName']、' \t \t \t \t \t ' '学校:私が使用してそれを行って'desc' => $ student ['desc'])); ' – iDev

+0

@iDev( 'schoolId' => $ student ['schoolId' - 私はそれが好きでしたので、あなたがやりたかったと思っていた複数の学校をサポートしました。 – Kickstart

1

あなたは非常に使いやすい、参加して読んでください。

SELECT a.studentName, b.schoolName, b.desc 
FROM students AS a 
INNER JOIN school AS b 
ON a.school = b.schoolId 

このようにして、複数のテーブルのすべてのデータを1つの結果として結合します。

echo $row['studentName'], ' is in this school ', $row['schoolName'], ' etc..'; 
関連する問題