2012-09-16 9 views
1

트랜잭션 레코드가 포함 된 데이터베이스가 있습니다. 각 레코드는 일련의 트랜잭션에 속하며 공유되는 TCID (트랜잭션 체인 ID)를가집니다. 각 트랜잭션에는 보낸 사람과받는 사람이 있습니다. 내가해야할 일은 체인의 최종 수신 사용자가 다른 체인의 첫 번째 발신자와 같은지 확인하는 것입니다.그룹의 첫 번째 레코드에서만 값 선택

현재 MySQL 쿼리는 최종 수신자가 첫 번째가 아닌 다른 체인의 트랜잭션에있는 레코드를 반환합니다. 최종 수신기와 첫 번째 발신자에게만 엄격하게 제한해야합니다.

그룹 by, order by 및 limit 1을 사용했지만 쿼리가 일부 레코드를 찾은 후에 적용됩니다. 여기에 지금까지 쿼리 시도했다 것 :

SELECT TCID FROM transactions WHERE senderUID = '$receiverUID' GROUP BY TCID LIMIT 1

사람은 내가 그룹 (TCID)의 첫 번째 (최저 TID) 레코드 만 senderUID를 검색 할 수있는 방법을 알아?

도움 주셔서 감사합니다.

답변

1

이 잘하면 올바른 방향으로 가야 -

//Gets rows where senderUID is the first (lowest TID) record in group 
SELECT a.* 
FROM test a 
WHERE a.senderUID = '$receiverUID' 
AND NOT EXISTS (select * from test where TCID = a.TCID and id < a.id and senderUID != '$receiverUID') 
GROUP BY TCID 

UNION 

//Gets rows where senderUID is the same as the last receiverUID of TCID 
SELECT b.* 
FROM test b 
WHERE b.receiverUID = '$receiverUID' 
AND NOT EXISTS (select * from test where TCID = b.TCID and id > b.id and receiverUID != '$receiverUID') 
GROUP BY TCID 

그래서 간단하게 예를 들어 내가 가지고있는

table data

테이블 -

그리고 다음 그래서 $ receiverUID = 1로 설정하면, senderUID가 TCID 그룹 (1,9)의 첫 번째 행이었고 3 행 (senderUID는 TCID 그룹 (4,7,8)의 receiverUID였습니다)

,403,210 TCID group for senderUID/receiverUID as 1

그리고 당신은 단지 1 개 행을 얻고 싶었다 경우 senderUID는 TCID 그룹의 첫 번째 어디에 당신은 LIMIT 1를 추가 할 수 있습니다 (1)/(4,7,8)

SELECT a.* 
FROM test a 
WHERE a.senderUID = '$receiverUID' 
AND NOT EXISTS (select * from test where TCID = a.TCID and id < a.id and senderUID != '$receiverUID') 
GROUP BY TCID LIMIT 1 

TCID group for senderUID/receiverUID as 1, limit only first row senderUID

TCID group for senderUID/receiverUID as 2

같은 생각이 내가 설정 한 경우 $ receiverUID = 2 (3,11)/(6,10)

및 (3)/(6,10) (012)
관련 문제