2017-11-11 3 views
-1

이 테이블 트랜잭션 당 트랜잭션 ID와 상태를 저장하는 "T"MySQL을 선택 거래는 또한 ID의 자손에 의해 주문

id  txn_id  status 
1  001   0 
2  001   2 
3  002   2 
4  002   0 
5  002   100 
6  003   0 
7  003   100 

내가 또한 가장 높은 상태로 거래를 얻을 필요 아이디 후손에 의해 주문 :

id  txn_id  status 
7  003   100 
5  002   100 
2  001   2 

를 지금까지 사용하고 :

SELECT id, txn_id, status FROM 1a1_ipn GROUP BY txn_id ORDER BY id DESC 

그러나 불운. 나는 아이디어가 부족하다.

답변

1
당신은이 같은 단일 쿼리에서 원하는 결과를 얻을 수 있습니다

도와주세요 :

select t.id , x.txn_id, x.status 
from `1a1_ipn` t 
join (SELECT txn_id, max(status) as status FROM `1a1_ipn` 
    GROUP BY txn_id) as x on t.txn_id = x.txn_id and t.status = x.status 
order by id desc 
+0

이것은 작동합니다. [특정 열의 그룹 별 최대 값 보유 행 수] (https://dev.mysql.com/doc/refman/5.7/en/example-maximum-column-group-row)에 설명 된 옵션 중 하나입니다. html). [SQL Fiddle] (http://sqlfiddle.com/#!9/3bd0d9/16)을 참조하십시오. –

1

이 데이터베이스 작업을 할 때 발생하는 일반적인 문제입니다. 이를 해결할 수있는 몇 가지 기술이 있습니다. SQL Fiddle

SELECT t1.* 
FROM `1a1_ipn` t1     
LEFT JOIN `1a1_ipn` t2 ON t1.txn_id = t2.txn_id AND t1.status < t2.status 
WHERE t2.status is NULL 
ORDER BY id DESC 

라이브 예 : I 다음은

이 가장 효율적인 것으로 간주됩니다 LEFT JOIN 방식을 사용했습니다.

다음 기술은 상관 하위 쿼리를 사용하고, 아마도 좀 더 직관적이다 :

SELECT * 
FROM (SELECT * FROM 1a1_ipn ORDER BY status DESC) AS s 
GROUP BY txn_id 
ORDER by id DESC 

라이브 예를 SQL Fiddle합니다.

실행 속도가 문제가되면 일반적으로 서브 쿼리보다 LEFT JOIN을 쓰는 것이 좋습니다.

이 기술 및 기타 기술에 대한 자세한 내용은 The Rows Holding the Group-wise Maximum of a Certain Column을 참조하십시오.

+0

당신이 맞습니다, 내 해결책은이 상황에 맞지 않았습니다. 나는 비슷한 요구 사항에 대해 HAVING을 사용했음을 기억하지만 적어도 여기에서는 작동하지 않습니다. 고맙습니다. – spirit

+0

와우 !!! 나는 첫번째 것을 좋아한다! 나는 최대 기술을 기억할 것입니다 :) MySQL과 T-SQL 양식을 그룹화 할 때 많은 차이가 있습니다. Micro $ oft – Radu

+0

또한 SQL Fiddle에 감사드립니다. – Radu