2010-09-02 35 views
1

我有3代表的受試者學生,和關係
下面是樣本數據PHP的MySQL joinget導致

 
students table 
id name 
1  John 
2  Doe 
3  Jane 

subject table 
id subject 
1  Math 
2  Science 
3  English 

relation table 
id student_id subject_id 
1  1    1 
2  1    3 
3  2    1 
4  1    2 

ID此時sudent = 1具有3科目。我怎樣才能得到這樣的結果?

 
student name is John 
subjects are: 
Math 
Science 
English 

我已經得到了學生的價值觀,我想要做的就是給用戶顯示他的主題。 我完全混淆了使用連接表。我是一名PHP新手,上週我開始學習。我的代碼出現錯誤。請幫忙。
我Cuurent代碼是這樣的:

 
<?php 
//mysql connection 

$query = " 
    SELECT *,* FROM relation, subject 
    on subject_id = id 
    WHERE student_id = $student_id 
"; 
$result = mysql_query($query); 
?> 
Student name is <?php echo $name ?><br /> 
Subjects are:<br /> 
<?php 
while($row = mysql_fetch_array($result)) { 
    echo $row["subject"]; 
} 
?> 

回答

0

簡單的方式做到這一點,是查詢所有學生:

SELECT * FROM `students`; 

,然後循環在PHP中的結果,現在各行的你必須使另一個查詢來獲取學生的科目:

SELECT * FROM `subject` WHERE `id` IN (SELECT subject_id FROM relation WHERE student_id={$student_row['id']}) 

假設$student_row是你選擇用於分配牽強把名稱記錄下來。

現在,您執行一個嵌套循環來獲取此查詢,並打印學生的主題。

+0

爲什麼要打擾兩個查詢?這正是SQL旨在通過JOIN處理的數據構造類型。 – 2010-09-02 17:44:44

+0

@Marc,他說他是新手,所以我想給出一個簡單的實現,注意它以*開始*簡單的方法是* – aularon 2010-09-02 17:46:42

2

首先確保您的查詢是正確的。我認爲這是你要找的東西:

SELECT subjects.* 
FROM subjects, 
INNER JOIN relations ON relations.subject_id = subjects.id 
WHERE relations.student_id = $student_id 

它可能支付在MySQL客戶端(例如,phpMyAdmin)檢查它。你會注意到在SELECT部分​​我只有主題*,因爲這就是你所需要的。

1

實際上,我會問一個面試問題,以排除那些沒有基本SQL知識但在簡歷中聲明這是直接實現的人。它可以導致有關數據庫設計,規範化,反規範化等一個很好的交談

什麼我希望看到的是基本的加入語法齊頭並進與您創建的關係表。

「從關係中選擇主題內部聯結關係.subject_id = subjects.id where relations.student_id =?」。

考慮下一步就可以了,你去

從「選擇對象內部聯接上relations.subject_id = subjects.id內部聯接學生relations.student_id = students.student_id其中students.name =關係話題?」 。

如果您不想將內部數據庫密鑰公開給外部用戶,則允許您在不預先獲取學生ID的情況下進行查詢。

問號是用於變量綁定的,它罕見的是它的合理實踐不能逃避數據庫交互的輸入。查詢的變量綁定是一個很好的覆蓋這個問題的簡單方法。

我喜歡把這個設計問題當作一個面試問題,因爲它可以快速導致關於SQL注入的討論,如何淨化Web表單輸入以及數據管理,Web應用程序開發和數據庫設計中的一般最佳實踐。

1

有這種情況的GROUP_CONCAT()聚合函數:

SELECT students.id, students.name, GROUP_CONCAT(subject.subject) AS subjects 
FROM students 
LEFT JOIN relation ON students.id = relation.student_id 
LEFT JOIN subject ON relation.subject_id = subject.id 
GROUP BY students.id 
ORDER BY students.name 

將返回這樣的數據:

+-------------+---------------+------------------------+ 
| students.id | students.name | subject.name   | 
+-------------+---------------+------------------------+ 
| 1   | John   | Math, English, Science | 
| 2   | Doe   | Math     | 
| 3   | Jane   | NULL     | 
+-------------+---------------+------------------------+ 

你可以做到這一點沒有分組,在這種情況下,你會得到一個爲每個id /學生姓名/學科名稱排行,然後你可以使用一個簡單的狀態機,如OMG Ponies的顯示部分答案。

1
<?php 
//mysql connection 
function query($query){ 
global $conn; 
$qu=mysqli_query($conn,$query); 
return $qu; 
} 

$query1 =query(" 
    SELECT * FROM student 
    WHERE student_id = $student_id 
"); 
$query2=query("SELECT * FROM relation, subject 
    WHERE relation.student_id = $student_id 
    AND subject.id=relation.subject_id 
"); 
$name=mysqli_fetch_assoc($query1); 
?> 
Student name is <?=$name['name']?><br /> 
Subjects are:<br /> 
<?php 
while($row = mysql_fetch_array($query2)) { 
    $rew[]=$row['subject'];//For store subject 
    echo $row["subject"]; 
} 
    $subject=join(",",$rew);//Get the stored subject from array 
?> 

也許可以幫助你嗎?