PHP MySQL缺少行(错误?)


PHP MySQL missing rows (bug?)

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 工作台返回以下内容:

序列号 助理 ID 审阅者 ID 名字 姓氏状态验证


4144449170 55 46 杰西卡·布莱克 完整的 Y
4744443020 56 46 莫琳·
4744443620 57 46 莎拉·兰 完整 Y
4744440430 58 46 路易丝
·6144448966 59 48 菲奥娜·卢 完整 Y
4444443238 60 48 托尼·
4744442765 61 46 奥利维亚·戴维 完整 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';

仅退货:

PHP 中的 5 行

MySQL 工作台中的 7 行

它不返回 FREDA 和 ANTHONY 的记录,并且在查询末尾假脱机大量空格。

我已经尝试了 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.审阅者 ID = 审阅者。审阅者 ID"联接和随之而来的代码。

编辑:

情况变得更糟。这只是一个基本的测试查询。

有一个验证名称和一个经理名称。两者都需要返回到表中。审阅和验证的记录位于同一表中。

已经有一个连接是这样的:

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

请尝试与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';

阅读有关联接的更多信息。