2010-07-27 2 views
15

tbl_producttbl_transaction의 두 테이블의 경우를 생각해보십시오.
tbl_product 목록하면서 이름과 ID를 포함하여 제품 세부 사항 tbl_transaction 나열 제품을 포함하는 거래와 날짜, 제품 IDS, 고객 등LEFT JOIN의 결과를 제한하는 방법

내가 10 개 제품을 보여주는 웹 페이지를 표시 할 필요가

및 각 제품의 마지막을 포함 5 거래. 지금까지 LEFT JOIN 쿼리가 작동하지 않는 것 같습니다. 그리고 mysql이 tx.product_id=ta.product_id 부분을 허용 할 수 있다면 아래의 하위 쿼리가 작동했을 것입니다 ('where 절'에서 알 수없는 'ta.product_id'열과 함께 실패합니다 : [ERROR : 1054]).

SELECT 
ta.product_id, 
ta.product_name, 
tb.transaction_date 
FROM tbl_product ta 
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx WHERE tx.product_id=ta.product_id LIMIT 5) tb 
LIMIT 10 

루프에서 여러 쿼리를 사용하지 않고 내가 필요한 목록을 달성 할 수있는 방법이 있습니까?

편집 :이 불법 물론

SELECT ta.product_id, ta.product_name, tb.transaction_date ... 
FROM tbl_product ta 
LEFT JOIN tbl_transaction tb ON (tb.product_id=ta.product_id LIMIT 5) 
LIMIT 10 

,하지만 난 정말 아니었다 소원 :
이 정확히 내가 MySQL의에서 필요한 것입니다!

+0

가입 할 때 "ON"절이 없습니까? –

+0

ON 절을 사용하더라도 여전히 5 개가 넘는 트랜잭션을 가져옵니다. 만약 내가'tx.product_id = ta.product_id'을 제거하고 LEFT JOIN (* my limitation sql *) tb tb.product_id = ta.product_id'를 수정했다면, 여전히 내가 원하지 않는 것 ~ –

+0

트랜잭션 테이블'tbl_transaction 이드가 있니? – gnarf

답변

6

순위 기능이 매우 유용합니다. 불행히도, MySQL은 아직 지원하지 않습니다. 대신 다음과 같은 방법을 시도해 볼 수 있습니다.

Select ta.product_id, ta.product_name 
    , tb.transaction_date 
From tbl_product As ta 
    Left Join (
       Select tx1.product_id, tx1.transaction_id, tx1.transaction_date 
        , (Select Count(*) 
         From tbl_transaction As tx2 
         Where tx2.product_id = tx1.product_id 
          And tx2.transaction_id < tx1.transaction_id) As [Rank] 
       From tbl_transaction As tx1 
       ) as tb 
     On tb.product_id = ta.product_id 
      And tb.[rank] <= 4 
Limit 10 
+0

응답 해 주셔서 고맙습니다, 토마스. 예, 'tbl_transaction'은 기본 키로 AUTO_INCREMENT 컬럼을가집니다. 귀하의 제안서를 시험해 보았지만 (나는 완전히 이해하지 못함에도 불구하고) 제품리스트를 얻었지만 아무런 ** 거래도하지 않았습니다. 왜 자기 조인 (tbl_transaction [tx] - )에? 서브 쿼리의 논리를 이해시켜 주시겠습니까? –

+0

@ eddy edu - 그것의 요지는 제품별로 거래에 순위를 매기는 것입니다. 이를 위해 트랜잭션 표를 자체와 비교하여 주어진 행보다 먼저 주어진 제품에 대한 트랜잭션 수를 찾습니다. 제품의 가장 이른 행은 0의 계수를 생성해야합니다. 자, 이상한 결과가 나오면 몇 가지 질문이 있습니다. 첫째, 거래 날짜가 null 일 수 있습니까? 둘째, 거래일을 중복시킬 수 있습니까? (동일한 product_id 및 날짜에 대해 두 행)? – Thomas

+1

transaction_date는 NULL 일 수 없습니다. transaction_date를 복제 할 수 있습니다 (한 제품이 주어진 날짜에 여러 트랜잭션을 가질 수 있음). 제품별로 거래 순위를 매길 필요가 있으므로 (제품별로 거래를 '그룹화'할 수 있도록), 날짜 열의 입력 방법을 알아야합니다. –

-2

부속 조회에서 조인 조건을 풀어 야합니다. 시도 :

SELECT 
    ta.product_id, 
    ta.product_name, 
    tb.transaction_date 
FROM tbl_product ta 
LEFT JOIN (SELECT tx.transaction_date 
      FROM tbl_transaction tx 
      ORDER BY tx.transaction_date DESC 
      LIMIT 5) tb 
ON ta.product_id=tb.product_id 
LIMIT 10 
+1

이 제품은 작동하지만 첫 번째 제품 만 제한적입니다. –

+2

하위 쿼리가 모든 트랜잭션에서 최신 트랜잭션 5 개만 반환하기 때문에 이는 작동하지 않습니다. 그는 "각 제품에 대해 마지막 5 건의 거래"라고 말했습니다. – nategood

1

쿼리를 괄호로 묶어 "tb"라는 별칭을 지정하면 파생 테이블을 만들었 기 때문에 실패합니다. 파생 테이블

하는 ON 사용해보십시오 "따"를 tbl_product 테이블 가진 별칭에 대한 지식이 없거나 파생 테이블의 외부는, 당신이 제공하는 "결핵"별칭을 사용하여 해당 테이블을 참조 WHERE

편집 :

"LIMIT"를 사용하면 쿼리 결과 전체가 제한됩니다. "LIMIT 10"이 실제로있는 동안 50 행 (또는 5 개 미만의 히스토리가있는 경우 작음)이 맞습니까?

10 개의 제품이 5 개의 기록 레코드와 결합되어 총 50 개의 행을 반환합니다.

SELECT * 
FROM tbl_product ta 
JOIN (SELECT * FROM tbl_product tz WHERE tz.product_id = ta.product_id LIMIT 10) tc 
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx 
    WHERE tx.product_id=ta.product_id LIMIT 5) tb 

당신 수 또한 우리 ":이 경우

, 당신은"LIMIT 10 "

등을 갖는 파생 테이블 자체에 제품 테이블에 합류 단일 쿼리 솔루션을 가질 수 있습니다 에서 "및 지정 10과 같은 :

SELECT * 
FROM tbl_product ta 
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx 
WHERE tx.product_id=ta.product_id LIMIT 5) tb 
WHERE ta.product_id IN 
    (SELECT z.product_id FROM tbl_product z LIMIT 10) 
+0

하위 쿼리에서 tbl_product 참조를 제거하고 ON 절에 추가하면 쿼리가 제대로 작동하지만 LIMIT는 첫 번째 제품에만 적용되는 것처럼 보입니다. 즉 첫 번째 제품에 10 개 목록을 얻습니다. 거래하지만 다른 모든 거래는 없습니다. –

+0

다시 파생 된 테이블 때문입니다. 파생 테이블의 "LIMIT"는 전체 쿼리의 "LIMIT"와 관련이 없습니다. 일부 샘플 데이터는 어떻습니까? – Matthew

+0

더 잘 설명하기 위해 내 대답을 편집했습니다. – Matthew

0

편집 :

당신이 원하는 경우 각 제품에 대한 제한을 적용하여 두 개의 쿼리로 구분합니다.

먼저 10 개 제품 목록을 가져온 다음 마지막 5 개 트랜잭션을 반환하는 각각에 대해 다른 쿼리를 실행하십시오.

+0

이 항목은 ON 절을 사용하여 수정 된 심각한 오류로 인해 실패합니다. '수정'후에 결과 집합에는 5 개의 트랜잭션이있는 첫 번째 제품 만 포함됩니다. 다른 제품은 무시됩니다. –

+0

나는 이것을 고려해 보았지만 이것에 대한 하나의 질문으로 해결할 수 있다고 확신한다! 그냥 있어야합니다! –