2014-03-30 39 views
1

我是新的SQL和PHP和我試圖實現從3代表的表展示內容如何使用外鍵實現多個MYSQL表格到PHP的HTML表格中?

我的主要表由job_idstaff_id*series_id*channel_id*(所有含有外鍵的另一個表的鏈接)。所有與*鏈接到他們是主鍵的另一個表。我想使用PHP在一個大表中顯示所有其他表信息。

到目前爲止,我能夠顯示我的主表沒有任何其他表信息與以下,我堅持要從這裏走,因爲這對我來說都是新的。

<?php 
$dbconnect=mysqli_connect('localhost', 'user', 'pass', 'database'); 
// Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

$result = mysqli_query($dbconnect,"SELECT * FROM JOB_LIST"); 
echo "<table border='1'> 
<tr> 
<th>Job ID</th> 
<th>Staff ID</th> 
<th>Channel ID</th> 
<th>Series ID</th> 
</tr>"; 
while($row = mysqli_fetch_array($result)) 
    { 
    echo "<tr>"; 
    echo "<td>" . $row['JOB_STAFF'] . "</td>"; 
    echo "<td>" . $row['JOB_CHANNEL'] . "</td>"; 
    echo "<td>" . $row['JOB_SERIES'] . "</td>"; 
    echo "</tr>"; 
    } 
echo "</table>"; 
mysqli_close($dbconnect); 
?> 

我需要從JOB_LIST(主鏈接表),STAFF_LISTSERIES_LIST & CHANNEL_LIST來選擇。最終結果錶行應該是:

echo "<td>" . $row['JOB_STAFF'] . "</td>"; //REFERENCES STAFF_ID 
echo "<td>" . $row['STAFF_FIRSTNAME'] . "</td>"; 
echo "<td>" . $row['STAFF_SURNAME'] . "</td>"; 
echo "<td>" . $row['STAFF_EMAIL'] . "</td>"; 
echo "<td>" . $row['JOB_CHANNEL'] . "</td>"; //REFERENCES CHANNEL_ID 
echo "<td>" . $row['CHANNEL_NAME'] . "</td>"; 
echo "<td>" . $row['CHANNEL_NETWORK'] . "</td>";  
echo "<td>" . $row['JOB_SERIES'] . "</td>"; //REFERENCES SERIES_ID 
echo "<td>" . $row['SERIES_NAME'] . "</td>"; 
echo "<td>" . $row['SERIES_COUNT'] . "</td>"; 

但我不知道需要更改以實現它。如果我沒有解釋某些東西,我很抱歉會試圖解釋一些更好的東西。

+3

LEFT JOIN是你的解決方案,你嘗試過嗎? – skywalker

+0

@skywalker我將如何去實現呢?我完全超出了我的深度。 –

+0

我不想粗魯或任何東西,但你有沒有試過谷歌我寫的?最好教你如何搜索,而不是給你完整的解決方案,但有人已經回答了,所以你不必打擾。 – skywalker

回答

1

正如已經說過LEFT OUTER JOIN是你所需要的。

有關的幾句話加入

一個簡單的CROSS兩個表之間的連接不附加任何條件不是別的,只是積。列將被添加在一起,行會倍增。因此,如果您有一個包含3列20行,另一列包含5列1000行的表,則連接表將包含3 + 5 = 8列和20 * 1000 = 20000行。

通常你不需要整個交叉產品。這就是爲什麼你可以利用條件。 INNER JOIN就像一個CROSS JOIN,但有一個額外的ON關鍵字定義了連接條件,以減少需要的結果行數。這意味着每一行不符合條件的行都被整理出來。從技術上講,它與WHERE子句相同,但不應該混淆,因爲它在語義上是一個非常不同的野獸。通常,連接條件與主鍵匹配。

可以執行多個連接,第一個與第二個表連接的結果將與第三個連接,等等。

SELECT * FROM table_1 AS t1 
    INNER JOIN table_2 AS t2 
    ON t1.foreign_key_1 = t2.primary_key 
    INNER JOIN table_3 AS t3 
    ON t1.foreign_key_2 = t3.primary_key; 

正如你所看到的,我也使用AS關鍵字給表中的別名。這很重要,因爲不同的表可能具有相同的字段名稱。這些所謂的限定名稱避免了任何可能的名稱衝突。

但INNER JOIN仍然不是你要找的。您有以下情況:

您希望在輸出表中爲每個不同的作業ID分配一行。無論它是否引用整組外鍵(staff_id,channel_id,series_id)或只有少數例外,它總是應該存在的。 staff_id和channel_id或根本沒有條目。

由於ON條件必須爲這兩個兩邊(表)的聯合的ON條件必須爲真的事實,INNER JOIN會拒絕所有這些部分行。幸運的是,LEFT OUTER JOIN確保左側的表格保留其所有行,並查找與右側表格中的ON條件相匹配的行。無法匹配的行中的列將填充NULL值。正如你可能已經猜到的那樣,一個正確的外部連接正好相反。

那麼,這就是你需要的查詢。

SELECT li.id AS job_id, st.id AS staff_id, st.firstname AS staff_firstname, st.surname AS staff_surname, 
    st.email AS staff_email, ch.id AS channel_id, ch.name AS channel_name, 
    ch.network AS channel_network, se.id AS series_id, se.name AS series_name, 
    se.count AS series_count 
    FROM job_list AS li 
    LEFT OUTER JOIN job_staff AS st 
    ON li.staff_id = st.id 
    LEFT OUTER JOIN job_channel AS ch 
    ON li.channel_id = ch.id 
    LEFT OUTER JOIN job_series AS se 
    ON li.series_id = se.id; 

這裏是更新的PHP部分。您可能必須根據需要調整少數列和表名稱,因爲我無法預知數據庫名稱和表格模式。但是根據我所做的SQL Fiddle,它應該按照你想要的方式工作。滾動到底部,您會看到查詢生成的表格。

$dbconnect=mysqli_connect('localhost', 'user', 'pass', 'test'); 

// Check connection 
if (mysqli_connect_errno()) 
{ 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$query = "SELECT li.id AS job_id, st.id AS staff_id, st.firstname AS staff_firstname, st.surname AS staff_surname, 
      st.email AS staff_email, ch.id AS channel_id, ch.name AS channel_name, 
      ch.network AS channel_network, se.id AS series_id, se.name AS series_name, 
      se.count AS series_count 
      FROM job_list AS li 
      LEFT OUTER JOIN job_staff AS st 
      ON li.staff_id = st.id 
      LEFT OUTER JOIN job_channel AS ch 
      ON li.channel_id = ch.id 
      LEFT OUTER JOIN job_series AS se 
      ON li.series_id = se.id;"; 

$result = mysqli_query($dbconnect, $query); 

echo "<table border='1'> 
<tr> 
    <th>Job ID</th> 
    <th>Staff ID</th> 
    <th>Staff Firstname</th> 
    <th>Staff Surname</th> 
    <th>Staff E-mail</th> 
    <th>Channel ID</th> 
    <th>Channel Name</th> 
    <th>Channel Network</th> 
    <th>Series ID</th> 
    <th>Series Name</th> 
    <th>Series Count</th> 
</tr>"; 

while($row = mysqli_fetch_array($result)) 
{ 
    echo "<tr>"; 
    echo "<td>" . $row['job_id'] . "</td>"; 
    echo "<td>" . $row['staff_id'] . "</td>"; 
    echo "<td>" . $row['staff_firstname'] . "</td>"; 
    echo "<td>" . $row['staff_surname'] . "</td>"; 
    echo "<td>" . $row['staff_email'] . "</td>"; 
    echo "<td>" . $row['channel_id'] . "</td>"; 
    echo "<td>" . $row['channel_name'] . "</td>"; 
    echo "<td>" . $row['channel_network'] . "</td>"; 
    echo "<td>" . $row['series_id'] . "</td>"; 
    echo "<td>" . $row['series_name'] . "</td>"; 
    echo "<td>" . $row['series_count'] . "</td>"; 
    echo "</tr>"; 
} 
echo "</table>"; 

mysqli_close($dbconnect); 

我希望我能說明一點點加入。如果有什麼不清楚,可隨意問。