쿼리에 대해 질문드립니다.

쿼리에 대해 질문드립니다.

QA

쿼리에 대해 질문드립니다.

본문

현재 쿼리문

-- 메모 관련 쿼리입니다.

 

select a.*,  CONCAT(a.me_recv_mb_id,a.me_send_mb_id) AS chat_name

from g5_memo a

left join g5_member b on (a.me_send_mb_id = b.mb_id)

where a.me_recv_mb_id = '내아이디' or a.me_send_mb_id = '내아이디'

GROUP BY chat_name

order by a.me_id desc limit 0, 20

 

 

chat_name 으로 group by 해서 묶을려고 하는되요

chat_name결과

내아이디상대방아이디

상대방이이디내아이디

 

 

참고로, 상대방 아이디는 같습니다.

이렇에 되니

1개로 안 묶이고, 2개로 출력이 됩니다. 혹시 방법이 있을까요?

고수님들 의견 부탁드립니다.

 

 

 

 

 

이 질문에 댓글 쓰기 :

답변 4


SELECT a.*, CONCAT(
    LEAST(a.me_recv_mb_id, a.me_send_mb_id), 
    GREATEST(a.me_recv_mb_id, a.me_send_mb_id)
) AS chat_name
FROM g5_memo a
LEFT JOIN g5_member b ON (a.me_send_mb_id = b.mb_id)
WHERE a.me_recv_mb_id = '내아이디' OR a.me_send_mb_id = '내아이디'
GROUP BY chat_name
ORDER BY a.me_id DESC LIMIT 0, 20

이렇게 쿼리 해보세요.

 



SELECT * FROM (
    SELECT 'send' TYPE, CONCAT(c.me_recv_mb_id, c.me_send_mb_id) chat_name, c.*
    FROM g5_memo c
    WHERE c.me_recv_mb_id = 'admin' -- 받은 사람만 체크하면됨
    GROUP BY chat_name
    UNION ALL
    SELECT 'recv' TYPE, CONCAT(c.me_send_mb_id, c.me_recv_mb_id) chat_name, c.*
    FROM g5_memo c
    WHERE c.me_send_mb_id = 'admin' -- 받은 사람만 체크하면됨
    GROUP BY chat_name
) c
ORDER BY c.me_id DESC LIMIT 0,20

이렇게 해보시면 어떨까요?

 

type은 보낸메세지인지, 받은메세지인지 구분하는 용도입니다.

 

where에 내아이디 조건이 있으니 concat가 필요 없겠습니다

상대방 아이디만 추출해오면 되는거죠

select a.*,  if(a.me_recv_mb_id ='내아이디', a.me_send_mb_id, a.me_recv_mb_id) chat_name

 

select a.*, CONCAT(a.me_recv_mb_id,a.me_send_mb_id) AS chat_name

 

from g5_memo a left join g5_member b on (a.me_send_mb_id = b.mb_id)

where a.me_recv_mb_id = '내아이디' or a.me_send_mb_id = '내아이디'

GROUP BY chat_name

order by a.me_id desc limit 0, 20

==

왜 join이 필요 한지 모르겠네요.

B 테이블은 

select, where, order by

어디에도 안 쓰이는데요.

where에 sender가 고정이면

group by는 필요 없고

Concat()대신

Group_concat()쓰시면 됩니다.

Order by me_od는 의미가 없습니다.

아이디 대신 이름이 필요한 거면
select * from ( select 'recv' type, group_CONCAT( distinct b.mb_name) AS chat_name from g5_memo a  Inner join g5_member b on a.me_send_mb_id = b.mb_id) where a.me_recv_mb_id = '내아이디' Union
select 'send' type, group_CONCAT(distinct b.mb_name) AS chat_name from g5_memo a  Inner join g5_member b on a.me_send_mb_id = b.mb_id) where a.me_send_mb_id = '내아이디') Atbl

group by 쓰는 목적은 채팅 방  처럼 나를 제외한 같은 상대방 아이디를 묶을 려고요
== 이미 where에 내 아이디 조건이 있어서 필요 없을 듯하구요

리스트 페이지에서  상대방 아이디가 1개만 보이게 처리 할려고 합니다.
== 한 개만" 이면 limit를 사용하세요

답변을 작성하시기 전에 로그인 해주세요.
전체 176
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT