$sth = $db->prepare("SELECT tblCompanies.*, users.Username, cargo.Name, (tblCompanies.Money + SUM(tblCTerminals.sellValue)) as assets, (COUNT(tblFinishedContracts.ID) + COUNT(tblFinishedSubContracts.ID)) as completed FROM ((((tblCompanies LEFT JOIN users ON tblCompanies.CompanyCEO = users.ID) LEFT JOIN cargo ON (tblCompanies.PreferredCargo = cargo.Cargo_ID)) LEFT JOIN tblCTerminals ON (tblCompanies.Company_ID = tblCTerminals.companyID)) LEFT JOIN tblFinishedContracts ON (tblCompanies.Company_ID = tblFinishedContracts.companyID)) LEFT JOIN tblFinishedSubContracts ON (tblCompanies.Company_ID = tblFinishedSubContracts.companyID) WHERE (users.Username LIKE :info || tblCompanies.CompanyName LIKE :info2 || CONCAT('$',FORMAT((tblCompanies.Money + SUM(tblCTerminals.sellValue)),2)) LIKE :info3 || CONCAT('$',FORMAT(tblCompanies.Money,2)) LIKE :info4 || cargo.Name LIKE :info5 || users.pLevel LIKE :info6 || CONCAT('$',FORMAT((users.Cash_In_Bank + users.Cash_In_Hand),2)) LIKE :info7)");

$sth->bindValue(':info', '%'.$_GET['sSearch'].'%', PDO::PARAM_STR);
$sth->bindValue(':info2', '%'.$_GET['sSearch'].'%', PDO::PARAM_STR);
$sth->bindValue(':info3', '%'.$_GET['sSearch'].'%', PDO::PARAM_STR);
$sth->bindValue(':info4', '%'.$_GET['sSearch'].'%', PDO::PARAM_STR);
$sth->bindValue(':info5', '%'.$_GET['sSearch'].'%', PDO::PARAM_STR);
$sth->bindValue(':info6', '%'.$_GET['sSearch'].'%', PDO::PARAM_STR);
$sth->bindValue(':info7', '%'.$_GET['sSearch'].'%', PDO::PARAM_STR);


好吧,现在我对这种混乱的推理:

我正在使用jQuery Datatables插件,当它向服务器发出请求时,它将发送查询。它期望返回结果,搜索查询中有多少个结果以及有多少个总结果。通过此查询,我可以返回结果。

但是,在COUNT(tblFinishedContracts.ID)上,该表已被抓8次。因此,例如,不是返回正确的数量8,而是返回计数112。

当我做:

SELECT COUNT(tblFinishedContracts.ID)
FROM tblCompanies
LEFT JOIN tblFinishedContract
     ON (tblCompanies.Company_ID = tblFinishedContracts.ID)
WHERE tblCompanies.Company_ID = 11


它有效,返回8。如果有人知道我尝试完成的更好方法,或者可以告诉我如何解决此问题,将不胜感激!

谢谢,

杰夫

编辑:添加,没有列具有重复的名称,一切都不同。

最佳答案

这个问题没有一个灵丹妙药。在获取有关父表的信息的同时,还要从具有一对多关系的多个子表中获取信息,总是很棘手。但是,有些技术可以提供帮助。

首先,除了从tblFinishedContracts中获取记录数之外,您实际上不执行任何操作。因此,您可以使用子查询:编写COUNT(tblFinishedContracts.ID),而不是编写(SELECT COUNT(1) FROM tblFinishedContracts WHERE Company_ID = tblCompanies.Company_ID)和使用联接。同样的情况也适用于tblFinishedSubContracts,因此您也可以消除该联接。 (顺便说一句,消除这些联接也可以显着提高您的性能,因为您只需要检索有关属于实际退回的公司的合同的信息。)

这解决了大多数问题。加入userscargo以获得首席执行官和首选货物的加入不会造成任何问题。 (对?)

剩下的唯一困难是tblCTerminals,因为SUM(tblCTerminals.sellValue)字段同时出现在字段列表和WHERE子句中。没有真正令人信服的方法来处理它。一种选择是使用上述子查询方法,该方法具有两个子查询副本。另一个方法是将FROM tblCompanies替换为FROM (SELECT tblCompanies.*, COALESCE(SUM(tblCTerminals.sellValue), 0) AS totalCTerminalSellValue FROM tblCompanies LEFT JOIN tblCTerminals ON tblCTerminals.Company_ID = tblCompanies.Company_ID GROUP BY tblCompanies.Company_ID) AS tblCompanies,这实质上是创建tblCompanies的临时副本,并添加一个名为totalCTerminalSellValue的新字段。因此,在查询的其他位置,您可以将SUM(tblCTerminals.sellValue)替换为tblCompanies.totalCTerminalSellValue

关于mysql - 多个左联接的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9752988/

10-13 03:17