2013-06-14 2 views
2

당 하나 개의 레코드를 가져 나는 열이있는 MySQL의 테이블 targeted_refillsuseridMySQL은 그룹

내가하려는 것은 각 userid에 대해 하나의 레코드를 나열하는 것입니다. 나열된 레코드는 last_date 필드를 기반으로 한 가장 최근의 레코드입니다. 그러나 가장 최근의 날짜를 가진 해당 사용자에 대해 둘 이상의 레코드가있는 경우에는 last_price 필드에서 가장 큰 값을 가진 필드를 선택해야합니다. 드문 경우로 last_datelast_price이 일치하는 레코드가 두 가지 있는데 (일어날 수는 없지만 가능합니다.) 어떤 것이 선택 되든 상관하지 않으므로 id의 가장 큰 값에서 선택할 수 있습니다. 기본 키.

편집 : 내가 다른 사람의 질문에서 함께 재현이 쿼리를 시도했습니다

:

SELECT t1.* 
FROM `targeted_refills` AS t1 
LEFT OUTER JOIN `targeted_refills` AS t2 
    ON t1.userid = t2.userid 
     AND (t1.last_date < t2.last_date 
     OR (t1.last_date = t2.last_date AND t1.last_price < t2.last_price)) 
WHERE t2.userid IS NULL; 

와 내가 가고 싶은 곳지고 합리적인 일을하지만, 그것은을 당기는 내가 원하는 것보다 더 적은 기록. 지금 당장 추려낸 추가 기록과 이유를 비교하려고합니다. 그것은 또한 실행하는 데 오랜 시간이 걸립니다.

+0

하위 쿼리를 사용해야합니다. 시작점으로 'SELECT'문이 있습니까? –

+0

[SQL] 열에 최대 값이있는 행만 선택하십시오 (http://stackoverflow.com/q/7745609/1037210). – Lion

+0

[열에 대한 최대 값을 가진 행 가져 오기] 가능한 중복 (http://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a- 열) –

답변

0

당신은 당신의 기존 쿼리 조금 조정할 수 업데이트 : 당신은 적어도 하나 이상이 모두 last_datelast_price이 여러 행에 걸쳐 동일한 경우 중복을 방지 조인 조건이 필요합니다. id을 자동 생성 했으므로이를 사용하여 행을 구분할 수 있습니다.

SELECT t1.* 
    FROM targeted_refills t1 LEFT JOIN targeted_refills t2 
    ON t1.userid = t2.userid 
    AND (
     t1.last_date < t2.last_date 
     OR 
     (t1.last_date = t2.last_date AND 
      t1.last_price < t2.last_price) 
     OR 
     (t1.last_date = t2.last_date AND 
      t1.last_price = t2.last_price AND 
      t1.id < t2.id)   
     ) 
WHERE t2.userid IS NULL; 

또는 당신이 당신의 목표를 다른 방법으로 여기

SELECT id, pat_name, pat_phone, rx_number, drug_name, 
     qty_disp, last_date, qty_left, price_code, 
     last_price, last_contact, doc_name, ehf, userid 
    FROM 
(
    SELECT r.*, 
     @n := IF(@u = userid, @n + 1, 1) rownum, 
     @u := userid 
    FROM targeted_refills r 
    ORDER BY userid, last_date DESC, last_price DESC 
) q 
WHERE q.rownum = 1 

을 달성 할 수는 모두 쿼리에 대한 SQLFiddle 데모입니다.

+0

감사. 둘 다 작동합니다 (SQLFiddle 데모에서 일부 데이터를 변경하여 다른 사람에게 도움이되는 경우 필자가 수행하려고했던 것과 일치하도록 데이터의 형식을 변경했습니다) [SQLFiddle] (http://sqlfiddle.com/# ! 2/71c06/1). 그것은 약 20,000 레코드를 통해 sifts로 나를 위해 정말 천천히 실행됩니다. 모든 것을 처리하는 데 몇 분이 걸립니다. 테스트 서버에 있기 때문에 "실제"서버에서 테스트 해 볼 수 있습니다. 어느 쪽이든, 몇 분의 대기 시간은 수동으로 수행하는 데 걸리는 시간보다 훨씬 낫습니다. 다시 한번 감사드립니다. – user1678042

+0

@ user1678042 도움이 되었기 때문에 기쁩니다. :). 'last_date'와'last_price'에 인덱스가 있는지 확인하십시오. 속도를 높이는 데 도움이 될 수 있습니다. – peterm

+0

DOH !!! 그것은 대개 내 첫 걸음 중 하나이지만 인덱스를 완전히 잊어 버렸습니다. 이제 분이 아닌 초입니다. 나는 말 그대로 얼굴을 마주 보았다. 다시 한 번 감사드립니다! – user1678042