2010-07-26 4 views
2

2 개의 다른 값을 표시하는 쿼리가 두 개 있지만 하나의 쿼리 결과가 예기치 않습니다.MySQL이 WHERE 절과 조인합니다.

에 Query1 :

SELECT SUM(T.amount_reward_user) AS total_grouping 
    FROM fem_user_cards UC 
     LEFT JOIN fem_transactions T USING(card_number) 
     LEFT JOIN fem_company_login FCL 
         ON T.fem_company_login_id=FCL.fem_company_login_id 
    WHERE UC.fem_user_login_id=193 
         AND FCL.grouping<>0 AND T.from_group=1 AND T.authorised=1 
    GROUP BY UC.fem_user_login_id 

위의 쿼리가 여기에 사용자가 193 나에게 총 보상 금액을 제공하는 조건은 분명 내가 군에서해야이 쿼리 벗어나 려하고 보상 금액입니다되는 from T.from_group = 1. 그래서 이것은 올바르게 작동하는 것 같습니다.

QUERY2 : T.from_group = 1이 아니라 T.from_group = 0에서의 보상 량을 추가하는 경우에도이 쿼리

SELECT SUM(T.amount_reward_user) AS total_grouping 
    FROM fem_transactions T 
LEFT JOIN fem_company_login FCL 
ON T.fem_company_login_id=FCL.fem_company_login_id 
    WHERE T.fem_user_login_id=193 
     AND FCL.grouping<>0 AND T.from_group=1 AND T.authorised=1 

. 아무도 문제가 뭔지 알고 있습니까? 예를 들어

:

회사 A의 사용자 193 구입 뭔가 (그룹 너무 T.from_group = 1) $ 1의 보상을 얻고 회사 B에서 $ 5 다른 제품을 구입 $ 5과 (교체 아웃 그룹의 T.from_group = 0). $ 1의 보상을 다시 받으십시오.

내 예상 출력은 다음과 같습니다

에 Query1 : 1

QUERY2 : 2

단순히하지만 난 다른 것들에 문제가있는 쿼리 (1)를 사용할 수 내가 점점 오전 1

내가 그것을 사용할 때 나는 정말로 무슨 일이 벌어지고 있는지 이해할 필요가있다 !!


나의 목표는 데이터베이스로부터 얻은 보상 금액의 합계를 얻는 것입니다. 합계는 다른 그룹화 된 회사 여야합니다. 5 개의 그룹화 된 회사가 있고 사용자가 5 개의 회사에서 그의 머니 카드를 사용하고 있다면 5 개의 다른 합계를 얻어야합니다. 그룹에 속하지 않은 회사에서 카드를 사용했다면이 그룹화되지 않은 회사의 거래는 포함되지 않아야합니다. 거래가 발생하면서 데이터베이스에 피드를 제공하는 C++ 코드가 있습니다. 내 fem_transactions 테이블에 company_id, amount_reward_user, fem_user_login_id, from_group이 있습니다 (사용자가 그룹 또는 그룹에서 거래했는지 여부를 결정합니다.)

각 사용자가 소비 한 금액을 필터링하고 싶습니다. 그룹별로

지금 JOINTS 개념을 이해했지만 두 번째 쿼리의 t.from_group이 무시되는 이유를 알아야합니까?

+1

을 당신과 함께 문제를 보여 일부 샘플 데이터와 출력을 게시해야합니다 당신이 기대하는 결과물. 질문을 수정하고이 정보를 추가하십시오. –

+0

나는 당신의 문제를 해결할 수 있는지 알지 못하지만 왼쪽 조인과 where 절을 더 잘 이해해야한다. 이 하나는 SQL Server에만 해당하지만 모든 데이터베이스에는 동일한 원칙이 적용될 수 있습니다. http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN – HLGEM

+0

응답을 게시하는 대신 원본 게시물을 편집해야합니다. 또한 일부 테이블 스키마를 볼 필요가 있습니다. 그룹화가 회사에 어떻게 적용되는지 나는 잘 모르겠습니다. – Thomas

답변

2

왼쪽 된 조인의 오른쪽에있는 열에 대해 Where 절에 조건이 있습니다. 두 쿼리 모두에서이 값은 And FCL.grouping <> 0입니다. 이렇게하면 FCL.grouping 값이 존재하고 0이 아니거나 널 (Null)이 아니어야하므로 Left Join을 Inner Join으로 효과적으로 변경합니다.

첫 번째 쿼리 :이 모든에 명확하지 않다 무엇

Select Sum(T.amount_reward_user) AS total_grouping 
From fem_user_cards UC 
    Left Join fem_transactions T Using(card_number) 
    Left Join fem_company_login FCL 
     On FCL.fem_company_login_id = T.fem_company_login_id 
      And FCL.grouping<>0 
Where UC.fem_user_login_id=193 
    And T.from_group=1 
    And T.authorised=1 
Group By UC.fem_user_login_id 

두 번째 쿼리

Select Sum(T.amount_reward_user) AS total_grouping 
From fem_transactions T 
    Left Join fem_company_login FCL 
     On FCL.fem_company_login_id = T.fem_company_login_id 
      And FCL.grouping<>0 
Where UC.fem_user_login_id=193 
    And T.from_group=1 
    And T.authorised=1 

무엇을 무엇 당신은 내가 생각하기에, 원하는 것은, ON 절에 기준이 있음을 이동하는 것입니다 당신은 성취하려고 노력하고 있습니다. 나는., 왜 당신이 그들을 필터링하지 않는 경우 왼쪽 조인 하나의 쿼리에 있습니다. 그룹화 값이 <> 0 인 fem_company_login 값이있는 행을 필터링하려면 원래 쿼리를 사용하고 왼쪽 조인을 내부 조인으로 변경하십시오. 당신도 전혀 다음과 같이 할 그룹화 값 <> 0 또는 값이 없음이있는 사람들을위한 필터링하려면 :

Select Sum(T.amount_reward_user) AS total_grouping 
From fem_transactions T 
    Left Join fem_company_login FCL 
     On FCL.fem_company_login_id = T.fem_company_login_id 
Where UC.fem_user_login_id=193 
    And T.from_group=1 
    And T.authorised=1 
    And (FCL.PrimaryKeyColumn Is Null Or FCL.grouping <> 0) 
+0

'where' 절이 조인의 의미를 바꿀 수 있다는 것을 알지 못했습니다. 필자는 가상 테이블이 조인 기준을 사용하여 생성 된 것처럼 조인이 동작하고 그 가상 테이블에'where' 절이 적용되었다는 의미가 있다고 생각했습니다. 행동에 대한 설명을 인용 할 수 있습니까? –

+0

@ 짐 게리슨 (Jim Garrison) - 조인의 성격 상 그 방식대로 작동합니다. 왼쪽 결합을 사용하면 왼쪽에있는 모든 항목과 오른쪽에 일치하는 항목을 묻습니다. 그런 다음 오른쪽 테이블의 열에있는 Where 절에 필터를 적용하고 Null을 고려하지 않으면 값 A가 필요합니다. 존재 함, B가 null이 아니고 C가 조건과 일치합니다 (예 : 등가, 같지 않음, 등등보다 큼). 따라서 'FCL.grouping <> 0'조건은 FCL의 행이 존재해야하며, null이 아닌 그룹화 값을 가져야하며 그 값은 0이 아니어야 함을 나타냅니다. – Thomas

+0

@Jim Garrison - 필터를 적용하면 계속됩니다. 왼쪽 결합의 오른쪽에있는 행이 있어야합니다. 실제로 내부 결합을하고 있습니다. – Thomas

관련 문제