2012-03-17 2 views
0
$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 번 점유하고 있습니다. 그래서 그 대신이 112

의 수를 반환 (8)의 정확한 금액을 반환의 예를 들어 내가 수행 할 때 누군가가 일을 더 좋은 방법을 알고 있다면

그것은 작동
SELECT COUNT(tblFinishedContracts.ID) 
FROM tblCompanies 
LEFT JOIN tblFinishedContract 
    ON (tblCompanies.Company_ID = tblFinishedContracts.ID)  
WHERE tblCompanies.Company_ID = 11 

, 그것은 8. 반환 무엇 성취를 위해 노력 중이거나 문제를 해결하는 방법을 알려 주시면 큰 감사를드립니다!

감사합니다,

제프

편집 : 추가, 더 열이 중복 된 이름이없는 모든 것이 다르다.

답변

1

이 문제에 대한 설명은 없습니다. 부모 테이블에 대한 정보를 얻는 동시에 일대 다 관계가있는 여러 자식 테이블의 정보를 얻는 것은 항상 까다 롭습니다. 그러나 도움이되는 몇 가지 기술이 있습니다.

먼저 실제로는 tblFinishedContracts으로 아무 것도하지 않습니다. 단, 그 중 하나에서 레코드 수를 얻는 것입니다. 따라서 COUNT(tblFinishedContracts.ID)을 작성하고 조인을 사용하는 대신 부속 조회를 사용할 수 있습니다. write (SELECT COUNT(1) FROM tblFinishedContracts WHERE Company_ID = tblCompanies.Company_ID). 동일한 내용이 tblFinishedSubContracts에 적용되므로 해당 결합도 제거 할 수 있습니다. 또한 실제로 반환되는 회사에 속한 계약에 대한 정보 만 검색하면되기 때문에 이러한 조인을 제거하면 성능이 크게 향상됩니다.

이렇게하면 중 가장을 처리합니다. 문제. CEO와 원하는화물을 얻으려면 userscargo에 조인하면 문제가 발생하지 않습니다. (오른쪽?)

SUM(tblCTerminals.sellValue) 필드가 필드 목록과 WHERE 절에서 모두 발생하므로 나머지 어려움은 tblCTerminals입니다. 그것을 처리 할 강력한 방법은 없습니다. 한 가지 옵션은 하위 쿼리의 두 복사본과 함께 위에서 언급 한 하위 쿼리 방법을 사용하는 것입니다. 또 다른 하나는 FROM tblCompaniesFROM (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으로 대체하는 것인데, 이는 totalCTerminalSellValue이라는 새 필드가 추가 된 tblCompanies의 임시 복사본을 만듭니다. 따라서 쿼리의 다른 부분에서 SUM(tblCTerminals.sellValue)tblCompanies.totalCTerminalSellValue으로 바꿀 수 있습니다.

+0

좋아,이게 내가 지금 가지고있는 올바른 구문을 확인하라는 오류가 나타납니다. "SELECT 1 FROM tblFinishedSubContracts where companyID = tblCompanies.Company_ID"':'SELECT COUNT (SELECT 1 FROM tblFinishedSubContracts WHERE companyID = tblCompanies.Company_ID) FROM ((tblCompanies LEFT JOIN화물 ON (tblCompanies.PreferredCargo = cargo.Cargo_ID)) LEFT JOIN tblCTerminals ON (tblCompanies.Company_ID = tblCTerminals.companyID)) 왼쪽 사용자를 tblCompanies.CompanyCEO = users.ID에 가입시킵니다.) 어디 tblCompanies.Company_ID = 7' 그것은 무엇이 잘못되었는지 확실히 모른다. – jefffan24

+0

@ jefffan24 : 내 잘못 : 한 쌍의 괄호를 생략했습니다. 'COUNT (SELECT ...)'는'COUNT ((SELECT ...)))'(한 쌍은'COUNT'에 속하며 그 인수를 구분하기 위해, 다른 한 쌍은 부질의에 속한다. 내 대답을 바로 잡았어. – ruakh

+0

새로운 문제 : 하위 쿼리가 1 개 이상의 행을 반환합니다 ... 하위 쿼리의 유형을 계산할 수 있습니까? – jefffan24