채택완료

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

현재 쿼리문

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

 

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개 / 댓글 8개

채택된 답변
+20 포인트

Copy
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개

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개

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

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

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

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

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

 

답변에 대한 댓글 1개

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

Copy
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은 보낸메세지인지, 받은메세지인지 구분하는 용도입니다.

 

답변에 대한 댓글 1개

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

🐛 버그신고