2014-06-11 4 views
1

개인 쿼리와 동일한 결과를 얻기 위해 두 가지 쿼리에 참여하려고합니다. 나는 MySQL의 쿼리에 숙련 된 사람이 아니기 때문에 내 처지가된다. 다음은 내 검색어 및 그 결과입니다. 여기 내 쿼리가 함께 결합 -두 테이블을 결합하는 MySQL이 잘못된 결과를 나타냅니다.

select  count(fbai.id) as totalRows 
from  FBAInventory fbai 
LEFT JOIN  FBAInventoryReport fbair 
ON   fbai.fbaInventoryReport_id = fbair.id 
where  fbai.asin = 'B002BRSCJ6' 
and  fbai.sku = '643356041428' 
    and   fbai.account_id = 8   
and   fbair.report_datetime BETWEEN '2014-05-12' AND '2014-06-11'; 
/* 
totalRows = 30 
*/ 

쿼리 # 3 :

다음

select  sum(fbaoh.qty) as sumQty 
from  FBAOrderHistory fbaoh 
where  fbaoh.asin = 'B002BRSCJ6' 
and   fbaoh.sku = '643356041428' 
    and   fbaoh.account_id = 8 
and   fbaoh.datetimePlaced BETWEEN '2014-05-12' AND '2014-06-11'; 
/* 
sumQty = 139 
*/ 

쿼리 # 2 : 여기에

쿼리 # 1
select  sum(fbaoh.qty) as sumQty, 
      count(fbai.id) as totalRows 
from  FBAOrderHistory fbaoh 
LEFT JOIN FBAInventory fbai 
ON   fbaoh.asin=fbai.asin 
LEFT JOIN FBAInventoryReport fbair 
ON    fbai.FBAInventoryReport_id=fbair.id 
where  fbaoh.asin = 'B002BRSCJ6' 
and   fbaoh.sku = '643356041428' 
    and   fbai.account_id = 8 
and   fbaoh.account_id = 8   
and   fbaoh.datetimePlaced BETWEEN '2014-05-12' AND '2014-06-11' 
and   fbair.report_datetime BETWEEN '2014-05-12' AND '2014-06-11'; 
/* 
sumQty = 4170 
totalRows = 3840 
*/ 
FBAOrderHistory

id | qty | sku  | asin | datetimePlaced 
------------------------------ 
1 | 1 | ABC  | 123  | 2014-05-20 06:06:03 

FBAInventory

id | sku  | asin | fbaInventoryReport_id 
--------------------------------------------------- 
1 | ABC  | 123  | 1 

FBAInventoryReport

id | report_datetime 
--------------------------------------------------- 
1 | 2014-05-20 06:06:03 
,691,363

: 여기

테이블 스키마이다210

쿼리 # 1 - 나는 sku와 asin 및 날짜 범위를 기반으로 합계를 얻고 있습니다.

쿼리 # 2 - 나는 sku와 asin 및 날짜 범위를 기반으로 전체 행을 얻고 있습니다.

쿼리 # 3 - 동일한 결과를 얻고 싶습니다. 두 쿼리 사이의 유일한 연결은 sku와 asin입니다.

분명히 마지막 쿼리의 결과가 내가 의도 한 결과가 아닙니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

내가 알 수있는 것은 다음과 같습니다. sumQty 및 totalRows를 표시하는 대신 실제로 sumQty (139)와 totalRows (30)를 곱하여 4170과 같습니다. 3840에 대해서는 어떻게 렌더링되는지 전혀 알지 못합니다.

누구에게도 도움을 주셔서 감사합니다.

+1

왜 완전히 다른 두 가지 쿼리에 참여 하시겠습니까? –

+0

질문에 귀하의 테이블 구조를 게시 할 수 있습니까? –

+0

"나무"조인을하고 있습니다. 'A-> B'와'A-> C'. 표 B와 C가 서로 다른 행 수를 가지면 한쪽으로 치우친 결과를 얻게됩니다. "더 큰"쪽은 더 작은 쪽의 누락 된 행을 강제로 Null로 채 웁니다. –

답변

0

이러한 쿼리는 합계를 버리고 발견 한대로 계산되므로 합류 할 수 없습니다. 그 이유는 이들 테이블간에 일대일 관계가 없기 때문입니다. 이를 수행하는 가장 좋은 방법은 다음과 같이 결과를 결합하는 것입니다.

select q1.sumQty, q2.totalRows 
from(
select  sum(fbaoh.qty) as sumQty 
from  FBAOrderHistory fbaoh 
where  fbaoh.asin = 'B002BRSCJ6' 
and   fbaoh.sku = '643356041428' 
    and   fbaoh.account_id = 8 
and   fbaoh.datetimePlaced BETWEEN '2014-05-12' AND '2014-06-11') q1, 
(select  count(fbai.id) as totalRows 
from  FBAInventory fbai 
LEFT JOIN  FBAInventoryReport fbair 
ON   fbai.fbaInventoryReport_id = fbair.id 
where  fbai.asin = 'B002BRSCJ6' 
and  fbai.sku = '643356041428' 
    and   fbai.account_id = 8   
and   fbair.report_datetime BETWEEN '2014-05-12' AND '2014-06-11') q2 
+0

두 번째 쿼리가 첫 번째 쿼리에서 asin 및 sku를 상속하게 만들 수 있습니까?내가 묻는 이유는 내가이 쿼리로 끝났기 때문에 (많은 단계가 여전히 남아있다) 내가 미리 정의한 asin과 sku를 다음과 같이 사용하지 않기 때문이다. "fbaoh.asin = 'B002BRSCJ6'and fbaoh.sku = '643356041428' ". 이 쿼리는 모든 행에 대해 실행 된 다음 결과 배열을 렌더링합니다. 감사! – LargeTuna

+0

@LargeTuna 아니에요. PHP 코드에서 동일한 값을 두 번 전달할 수 있어야합니다. 이것들은 실제로 집계 덕분에 두 가지 별도의 쿼리이므로 변수를 한 번 사용하는 확실한 방법을 모릅니다. – Vulcronos

관련 문제