쿼리에 대해 질문드립니다.
본문
현재 쿼리문
-- 메모 관련 쿼리입니다.
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는 의미가 없습니다.