2016-11-18 16 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''學校'=> array('schoolId'=> $ student ['schoolId'],'schoolName'=> $ student ['schoolName'],'desc'=> $ student ['desc']));' – iDev

+0

@iDev - 我這樣做,所以它會支持我認爲你想要做的多所學校(因爲你想爲每個學生排列一個陣列)。 – Kickstart

1

你應該閱讀加入,使用非常簡單。

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

這樣,您將來自多個表的所有數據合併爲一個結果。

echo $row['studentName'], ' is in this school ', $row['schoolName'], ' etc..';