2017-01-02 32 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'