테스트 사이트 - 개발 중인 베타 버전입니다

쿼리에 대해 질문드립니다. 채택완료

sukja 2년 전 조회 1,932

현재 쿼리문

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

 

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개

채택된 답변
+20 포인트

</p>

<p>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

이렇게 쿼리 해보세요.

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

s
sukja
2년 전
감사합니다. ^^~

댓글을 작성하려면 로그인이 필요합니다.

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는 의미가 없습니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 5개

엑스엠엘
2년 전
중복을 피하려고
group by를 쓰신 거면
Concat() 안에 Distinct 쓰시면 됩니다.
https://mariadb.com/kb/en/group_concat/
엑스엠엘
2년 전
아이디 대신 이름이 필요한 거면
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
s
sukja
2년 전
group by 쓰는 목적은 채팅 방 처럼 나를 제외한 같은 상대방 아이디를 묶을 려고요
리스트 페이지에서 상대방 아이디가 1개만 보이게 처리 할려고 합니다.
s
sukja
2년 전
답변감사합니다. ^^
엑스엠엘
2년 전
group by 쓰는 목적은 채팅 방 처럼 나를 제외한 같은 상대방 아이디를 묶을 려고요
== 이미 where에 내 아이디 조건이 있어서 필요 없을 듯하구요

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

댓글을 작성하려면 로그인이 필요합니다.

2년 전

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

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

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

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

s
sukja
2년 전
네, 상대방 아이디만 남 길려고 하는거였습니다.
감사합니다. ^^

댓글을 작성하려면 로그인이 필요합니다.

플래토
2년 전

</p>

<p>

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</p>

<p>

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

 

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

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

s
sukja
2년 전
감사합니다. ^^~

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인