2014-01-24 2 views
0

저는 쿼리에 대한 작업을하고 있으며 동일한 행을 여러 번 표시합니다. 둘 사이를 번갈아 표시합니다. 내가 언급 한 모든 테이블에서 모든 열을 선택하고 행 사이의 차이점을 보지 못했습니다 테스트. 리턴 된 행이 2 개만 있어야하며 10을 초과한다는 점에 유의하십시오.sql select는 동일한 행 집합을 여러 번 반환합니다.

이것은 trc 테이블과 mlc 테이블을 결합하는 것과 관련이 있다고 생각하지만이를 고치는 방법에 대해 고민하고 있습니다. 어떤 도움을 주셔서 감사합니다. 감사.

SELECT mlc.click_amount AS memPayout 
     FROM tbl_trackvalue AS trv, tbl_tracking AS t, tbl_offers AS off, tblusers AS usr, tbl_mailchimp_trackvalue as mlc 
     WHERE mlc.tracking_id = trv.tracking_id 
       AND off.id = t.offer_id 
       AND off.offer_type = 'mailchimp' 
       AND usr.id = trv.tr_user_id 
       AND trv.tr_user_id =1454 
       AND mlc.requested_date = '2014-01-21' 
       AND mlc.payment_status = 'pending' 
       AND mlc.requested_status = 'declined' 

업데이트 된 코드 :.. II는 (다시 변경

SELECT mlc.click_amount AS memPayout 
             FROM tbl_trackvalue AS trv, tbl_offers AS off, tbl_mailchimp_trackvalue as mlc 
             WHERE mlc.tracking_id = trv.tracking_id 
             AND off.id = trv.tr_offer_id 
             AND off.offer_type = 'mailchimp' 
             AND trv.tr_user_id =1454 
             AND mlc.requested_date = '2014-01-21' 
             AND mlc.payment_status = 'pending' 
             AND mlc.requested_status = 'declined' 

UPDATE, 그것은 도움을 주셔서 감사합니다 작동이 시간 나는 아주 새로운 해요, 지금은 이름 조인 명시의 중요성을 실현 :

SELECT mlc.click_amount AS memPayout 
    FROM tbl_mailchimp_trackvalue as mlc inner join tbl_trackvalue AS trv on mlc.tracking_id=trv.tracking_id 
    WHERE trv.type = 'mailchimp' 
    AND trv.tr_user_id =1454 
    AND mlc.requested_date = '2014-01-21' 
    AND mlc.payment_status = 'pending' 
    AND mlc.requested_status = 'declined' 
+2

가입이 누락 된 경우 테이블 구조를 게시하거나 http://sqlfiddle.com/을 작성해야합니다. – Sumit

+0

'내부 조인 (inner join) '을 사용하면 조인이 where 절의 필터와 분명히 구별되는 것을 알 수 있습니다. 그것은 또한 당신이 그들에서 만든 모든 오류를 발견하는 데 도움이 될 것입니다. – GolezTrol

+0

테이블 tblusers 테이블 가입처럼 보이는 꽤 쓸모가 없다. – Xardas

답변

0

Y. o에 t을 조인하고 trvusrmlc에 가입시키지 만 두 조인 블록 간에는 조인이 수행되지 않습니다.

+0

답변 해 주셔서 감사합니다. 나는 이것 모두에 아주 새롭다. 내가 언급 한 모든 테이블에 언급 된 모든 테이블에 참여해야한다는 말입니까? 일부 아이디어를 반영하도록 코드를 업데이트했습니다. – programmingnewb

+0

모든 테이블의 모든 테이블을 조인 할 필요는 없지만 모든 관련 조건을 지정해야합니다. 조건없이 조인하면 A의 행 수와 B의 행 수를 얻게됩니다. A와 B 사이의 관계를 지정하여 그 수를 줄여야합니다. 원래 쿼리에서 거기에있는 대부분의 관계 , 그렇다면 관련이없는 두 개의 테이블 그룹이있었습니다. 테이블 구조를 지정하지 않았으므로 정확하게 추가 할 내용을 설명하기는 어렵지만, 지정하지 않은'trackvalue'와'tracking' 사이에 링크가 있어야합니다. – GolezTrol

+0

'내부 조인 (inner join) '의 이점은 조인을 작성하는 훨씬 더 명확한 방법으로, 조인 조건 (릴레이션)을 필터 ('where' 절에 넣은 것들)로 분리하는 것입니다. 또한'left join '을 사용할 수 있는데, B에서 0 개 이상의 관계가있는 A의 정보를 쿼리하고자 할 때 사용할 수 있습니다.'cross join'이 있습니다. 이것은 기본적으로 쉼표를 사용하여 테이블을 분리하는 것과 같습니다 너처럼. – GolezTrol

0

하면 SELECT DISTINCT를 사용할 수있는 중복 행을 제거하는

+0

그렇게 할 수는 있지만 실제로하기 전에 두 번 생각해야합니다. 쿼리에서 실수로 인해 행이 중복되는 경우가 많으며 SELECT DISTINCT를 사용하면 (일시적으로) 문제를 숨길 수 있습니다. 따라서 왜 행을 많이 차지하게되는지 확실한 경우에만 사용하십시오. 행의 수에 놀랄 때 패치가 아닙니다. – GolezTrol

관련 문제