$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.如果有人知道一个更好的方式来做我想要完成的事情或者可以告诉我如何解决这个问题,我们将不胜感激!
谢谢,
杰夫
编辑:要添加,没有列具有重复的名称,一切都不同。
答案 0 :(得分:1)
这个问题没有单一的银弹;获取有关父表的信息,同时从多个具有一对多关系的子表中获取信息总是很棘手。但是有一些技术可以提供帮助。
首先,除了从中获取记录之外,你实际上并没有对tblFinishedContracts
做任何事情;因此,您可以使用子查询而不是编写COUNT(tblFinishedContracts.ID)
并使用连接:write (SELECT COUNT(1) FROM tblFinishedContracts WHERE Company_ID = tblCompanies.Company_ID)
。同样的事情适用于tblFinishedSubContracts
,因此您也可以消除该连接。 (顺便说一下,消除这些连接也应该显着提高您的性能,因为您只需要检索有关实际返回的公司的合同的信息。)
负责解决问题的大多数。加入users
和cargo
以获得首席执行官和首选货物不应该造成任何问题。 (右?)
唯一剩下的难度是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
。