하나의 테이블에 있는 두개의 컬럼값이 같은 것끼리 묶어서 그중 최신 행 1개 들만 뽑아낼수 있나요?
조회수 1825회
- List item
컬럼 보낸 사람 | 메세지코드 | 내용 | 받는사람 | 보낸시간
A ME-1 "AA" B 12:30
A ME-1 "AA" B 12:32
B ME-1 "AA" A 12:31
B ME-1 "AA" A 12:33
A ME-1 "AA" C 12:30
A ME-1 "AA" C 12:32
C ME-1 "AA" A 12:31
C ME-1 "AA" A 12:33
이런 테이블이 있는데
B와 C 를 직접입력하지 않고 A 만 가지고 A와 B의 대화 내용중 제일 최신 행, A와 C의 대화 내용중 제일 최신 행을 꺼내오고 싶은데 가능 한가요?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
본 답변은 다음 가정 하에 작성되었습니다.
보낸 사람 | 메세지코드 | 내용 | 받는사람 | 보낸시간
의 컬럼 명이sender, message_code, content, receiver, timestamp
와 같음- 테이블의 이름은 table 임.
물음에 대한 답변은 다음과 같고요.
select speaker, max(timestamp) from (select (if(sender ='A') then receiver else sender) as speaker, timestamp from table where sender = 'A' or receiver = 'A') opponent group by speaker
설명하자면,
select (if(sender ='A') then receiver else sender) as speaker, timestamp from table where sender = 'A' or receiver = 'A'
로 A와 통화한 기록을 묶은 테이블
opponent
를 임시로 만들어,이
opponent
테이블을 speaker 로 group_by 해 timestamp의 max 값을 찾아주면 되겠네요.
표로 설명하자면
1. 원본 테이블(table)이 다음과 같고,
sender message_code content receiver timestamp A ME-1 AA B 12:30 A ME-1 AA B 12:32 B ME-1 AA A 12:31 B ME-1 AA A 12:33 A ME-1 AA C 12:30 A ME-1 AA C 12:32 C ME-1 AA A 12:31 C ME-1 AA A 12:33 2. 다음 쿼리로 만들어진 opponent 테이블은 다음과 같습니다.
select (if(sender ='A') then receiver else sender) as speaker, timestamp from table where sender = 'A' or receiver = 'A') opponent
speaker timestamp B 12:30 B 12:32 B 12:31 B 12:33 C 12:30 C 12:32 C 12:31 C 12:33 3. 2에서 만든 opponent 테이블에 group by speacker 로 max(timestamp)를 찾으면 다음과 같은 결과가 나옵니다.
speaker timestamp B 12:33 C 12:33 -
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력