2015-11-03 20 views
1
SELECT 
    tblassistant.identNumber, 
    tblreview.ReviewID, 
    tblreview.Status, 
    tblreview.AssistantId AS AssistID, 
    tblassistant.Forename AS AssistForename, 
    tblassistant.Surname AS AssistSurname, 
    tblreview.Validation 
FROM tblreview, tblassistant 
WHERE 
    tblreview.Validation = 'Y' 
    AND tblassistant.Test <> 'Y' 
    AND tblassistant.identNumber = tblreview.assistantidentNumber 
    AND YEAR(STR_TO_DATE(tblassistant.DateDied,'%d/%m/%Y')) = '2014' 
    AND MONTH(STR_TO_DATE(tblassistant.DateDied,'%d/%m/%Y')) = '9'; 

該查詢返回以下,使用PHPMySQL的工作臺PHP MySQL的缺失行(錯誤?)

序列號助手ID審閱ID名姓狀態確認


4144449170 55 46 JESSICA BLACK Complete Y
4744443020 56 46 Maureen Gar Y
474444 3620 57 46 SARAH RAN複合Y
4744440430 58 46路易絲WHITý
6144448966 59 48 FIONA LEW複合Y
4444443238 60 48託尼BRETHý
4744442765 61 46 OLIVIA DAVIE複合Y

然而,當我跑下面的查詢:

SELECT 
    tblreview.AssistantIdentNumber, 
    tblreview.AssistID, 
    tblreview.Status, 
    tblreview.ReviewerId AS RevID, 
    tblAssistant.Forename AS RevForename, 
    tblAssistant.Surname AS RevSurname, 
    tblreview.Validation 
FROM tblreview, tblreviewer, tblAssistant 
WHERE 
    tblreview.ReviewerID = tblreviewer.ReviewerID 
    AND tblreview.Validation = 'Y' 
    AND tblAssistant.Test <> 'Y' 
    AND tblAssistant.IdentNumber = tblreview.AssistantIdentNumber 
    AND YEAR(STR_TO_DATE(tblAssistant.DateDied,'%d/%m/%Y')) = '2014' 
    AND MONTH(STR_TO_DATE(tblAssistant.DateDied,'%d/%m/%Y')) = '9'; 

僅返回:

5行PHP

7排在MySQL工作臺

不退還FREDA和安東尼的記錄,它線軸大量的空間,以查詢的結束。

我曾經嘗試都一個for循環和while循環

for($i=0;$i<$rowCount;$i++) 
{ 
    $row[$i]= mysql_fetch_array($ValidationPart); 
    // writes out HTML table 
} 

for($i=0;$i<$rowCount;$i++) 
{ 
    $row[$i]= mysql_fetch_array($ValidationPart); 
    if (empty($row[$i]['IdentNumber'])) 
    { 
     //do nothing 
    } else { 
     // Prints out HTML table 
    } 
} 

我不得不隱匿了很多本,因此查詢可能不匹配。但是,除了「tblreview.ReviewerID = tblreviewer.ReviewerID」連接和代碼外,它們都是相同的。

編輯:

它變得更糟。那只是一個基本的測試查詢。

有驗證名稱和經理姓名。兩者都需要返回到表格。審覈和驗證的兩個記錄都在同一個表格中。

已經有一個加入該是這樣的:

LEFT JOIN 
(SELECT tblreview.AssistantIdentNumber, 
tblreview.AssistId, 
tblreview.Status, 
tblreview.ManagerId AS RevID, 
tblreviewer.Forename AS RevForename, 
tblreviewer.Surname AS RevSurname 
FROM tblreview, tblreviewer 
WHERE tblreview.ReviewerId = tblreviewer.ReviewerId 
AND tblreview.Status = 'Complete' 
AND IsNull(tblreview.Validation)) r 

添加其他兩個連接從答案讓查詢任何回報。

必須首先運行子選連接,然後再運行其他兩個連接到其他表。然後在其他表的兩個連接中,您必須明確引用您想要的表。所以在我的情況下,主選擇有「tblname1 v」,然後子選擇是「r」。然後你引用v.ID = othertbl。ID

+0

使用'LEFT JOIN',而不是'WHERE'。 – kotapeter

回答

2

請嘗試LEFT JOIN使關係:

SELECT 
    tblreview.AssistantIdentNumber, 
    tblreview.AssistID, 
    tblreview.Status, 
    tblreview.ReviewerId AS RevID, 
    tblAssistant.Forename AS RevForename, 
    tblAssistant.Surname AS RevSurname, 
    tblreview.Validation 
FROM tblreview 
LEFT JOIN tblreviewer 
    ON tblreview.ReviewerID = tblreviewer.ReviewerID 
LEFT JOIN tblAssistant 
    ON tblAssistant.IdentNumber = tblreview.AssistantIdentNumber 
WHERE 
    tblreview.Validation = 'Y' 
    AND tblAssistant.Test <> 'Y' 
    AND YEAR(STR_TO_DATE(tblAssistant.DateDied,'%d/%m/%Y')) = '2014' 
    AND MONTH(STR_TO_DATE(tblAssistant.DateDied,'%d/%m/%Y')) = '9'; 

Read more about Joins.

+0

謝謝。完美的作品。你能解釋爲什麼需要這個嗎? – Jen

+0

請閱讀本文以瞭解「where和join關係有何區別」:http://www.tutorialspoint.com/mysql/mysql-using-joins.htm – kotapeter

+0

謝謝。你能否解釋第三次加入可以如何與其他一切結合? – Jen