2017-01-02 11 views
2

私はこの質問が何度か尋ねられるかもしれないが、ある時点で私はその理由を理解することができません。ここでphpとmysqlを使用して多対多の関係を使ってデータを引き出す方法

は、私はこれら3つのテーブルを使用してデータを取得する必要が質問

私は多くの関係に多くのようにお互いの関係

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  |  | |   | 
+-----------+  +-------------+  +---------------+ 

を持つ3台を持っています接合テーブル付き

接続テーブル(ジャンクション表)MySQLとPHP

 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  |   
+-----------------------+ +---------------------------+ 

は私がどこ

$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); 

第二のアプローチ

を理解するのに役立つかもしれない、これはかもしれ試しSTUDENT_ID

$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 

は学生からのid列とStudent_SubjectからSTUDENT_ID列を使用してStudent_Subjectに参加。

Student.id = Student_Subject

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' 
関連する問題