2017-01-02 34 views
2

我知道這個問題可能會問幾次,但在某些時候,我無法理解,因爲我這個問題。如何使用php和mysql使用多對多關係拉動數據

這裏是問題

我有具有彼此像許多之間關係到許多關係三個表

Teacher   Student    Subject  
+-----------+  +-------------+  +---------------+ 
| id| name |  | id| name |  | id| name  | 
+-----------+  +-------------+  +---------------+ 
| 1 | Ram |  | 1 | Vikram |  | 1 | Math  | 
| 2 | Ajay |  | 2 | Sunil |  | 2 | English | 
| 3 | John |  | 3 | Mohan |  | 3 | Physics | 
| 4 | Eric |  | 4 | Pawan |  | 4 | Chemistry | 
| 5 | Manoj |  | 5 | Deepak |  | 5 | Biology | 
| 6 | Shiv |  | 6 | Alex |  | 6 | Social Sci| 
| |  |  | 7 | Shawn |  | 7 | Hindi  | 
| |  |  | 8 | Mark |  | 8 | History | 
| |  |  | 9 | Joe  |  | |   | 
+-----------+  +-------------+  +---------------+ 

我要拉使用這三個表的數據連接表

連接表(連接點表)

 Teacher_Subject    Student_Subject  
+-----------------------+ +---------------------------+ 
|teacher_id |subject_id | | student_id | subject_id |   
+-----------------------+ +---------------------------+ 
|  1  |  7  | |  1  |  1  |   
|  1  |  8  | |  1  |  3  |   
|  2  |  1  | |  1  |  4  |   
|  2  |  3  | |  1  |  5  |   
|  3  |  2  | |  2  |  4  |   
|  4  |  6  | |  2  |  7  |   
|  5  |  4  | |  3  |  1  |   
|  6  |  5  | |  3  |  4  |   
|   |   | |  3  |  5  |   
|   |   | |  4  |  2  |   
|   |   | |  4  |  6  |   
+-----------------------+ +---------------------------+ 

與MySQL和PHP

有沒有辦法用一個單一的查詢

例如

我要拉的數據來拉這個數據,其中

$student = 'Vikram'; 

所以數據我想要這個數組

$result = [ 
    'name' => 'Vikram', 
    'subjects_teacher' => [ 
     [ 
      'subject' => 'Math', 
      'teacher' => 'Ajay' 
     ], 

     [ 
      'subject' => 'Physics', 
      'teacher' => 'Ajay' 
     ], 

     [ 
      'subject' => 'Chemistry', 
      'teacher' => 'Manoj' 
     ], 

     [ 
      'subject' => 'Biology', 
      'teacher' => 'Shiv' 
     ] 
     ] 
    ]; 

關係挖

enter image description here

所以,請幫我在這種情況下,因爲我看過很多教程和google搜索,但沒有得到這一點。

+0

在哪裏之間的關係桌子?就像上面的表格結構中沒有任何東西,讓我把老師「Ajay」與主題「數學」聯繫起來。 –

+1

你「只是」必須將所有6個表格連接到一些「where x.id = y.id」,然後遍歷結果來構建你的數組。你有沒有嘗試過? – Jeff

+0

@AndrewLarsen再次看看我剛剛編輯 – User97798

回答

1

嘗試,這可能是它可以幫助你瞭解

第一種方法

$sql = "SELECT 
    Student.id, 
    Student.name, 
    Teacher.name AS teacher, 
    subject.name AS subject 
FROM 
    Student 
LEFT JOIN 
    Student_Subject ON Student.id = Student_Subject.student_id 
LEFT JOIN 
    Teacher_Subject ON Student_Subject.subject_id = Teacher_Subject.subject_id 
LEFT JOIN 
    Teacher ON Teacher_Subject.teacher_id = Teacher.id 
LEFT JOIN subject ON 
    Student_Subject.subject_id = subject.id 
WHERE 
    Student.name = 'Vikram'"; 

$result = mysqlQuery($sql); // your custom function like using pdo or mysqli 

$finalResult = []; 
foreach ($result as $key => $value) { 

    if (!isset($finalResult[$value['id']]['name'])) { 
     $finalResult[$value['id']]['name'] = $value['name']; 
    } 

    $finalResult[$value['id']]['subjects_teacher'][] = [ 
      "teacher" => $value['teacher'], 
      "subject" => $value['subject'], 
     ]; 
} 

print_r($finalResult); 

第二種方法 「不建議」

$sql = "SELECT 
    Student.name, 
    jt.subjects_teacher 
FROM 
    Student 
LEFT JOIN (
    SELECT 
     ss.student_id, 

     CONCAT('[',GROUP_CONCAT(CONCAT('{\"teacher\":\"', t.name,'\",\"subject\":\"', s.name, '\"}')),']') AS subjects_teacher 

    FROM `Student_Subject` ss 
    LEFT JOIN 
     Teacher_Subject ts ON ss.subject_id = ts.subject_id 
    LEFT JOIN 
     Teacher t ON ts.teacher_id = t.id 
    LEFT JOIN 
     subject s ON ss.subject_id = s.id 
    GROUP BY ss.student_id 
) jt ON jt.student_id = Student.id 

WHERE 
    Student.name = 'Vikram'"; 

$result = mysqlQuery($sql); // your custom function like using pdo or mysqli 
foreach ($result as $key => &$value) { 
    $value['subjects_teacher'] = json_decode($value['subjects_teacher'], true); 
} 

print_r($result); 
2

我沒有測試這一點,我不知道該架構的結構是很容易的加入,但這樣的事情

要澄清一下是怎麼回事。我們從一個表中選擇並使用一個公共列來爲另一個表創建'連接'。然後,我們可以使用該連接表中的值。

所以我們的第一個加入

left join Student_Subject on Student.id = Student_Subject.student_id 

使用Student_Subject從學生ID列並從Student_Subject的student_id數據列加入。

Student.id = Student_Subject。student_id數據

select 
Student.name, 
Teacher.name, 
Subject.name 
from Student 
left join Student_Subject on Student.id = Student_Subject.student_id 
left join Teacher_Subject on Student_Subject.subject_id = Teacher_Subject.subject_id 
left join Teacher on Teacher_Subject.teacher_id = Teacher.id 
left join Subject on Student_Subject.id = Subject.id 
where Student.name = 'Vikram'