mysql select 질문입니다.
본문
$sql = sql_query("SELECT * FROM g5_member WHERE mb_level=3 ORDER BY write_num + reply_num + good_action_num DESC, write_num DESC");
이런 쿼리문이 있습니다. 설명하자면 멤버테이블에서 레벨 3인 사람을 글갯수(write_num), 댓글갯수(reply_num), 좋아요 한 갯수(good_action_num) 를 더해서 정렬하는 쿼리문입니다.
여기서 질문이 있습니다. 이쿼리문에서 한발 더 나아가서 다른 테이블에 있는 같은 형식의 write_num, reply_num, good_action_num을 비교해서 연산하려고 합니다. 처음에 있는 쿼리문중에 write_num,reply_num, good_action_num 에 g5_support 테이블에 있는 write_num,reply_num, good_action_num을 가져와서 각각 빼고 뺀값들을 합치는 쿼리 입니다.
$sql = sql_query("SELECT g5_member.mb_id
FROM g5_member, g5_support
WHERE g5_member.mb_level = 3
ORDER BY (g5_member.write_num - g5_support.write_num) + (g5_member.reply_num - g5_support.reply_num) + (g5_member.good_action_num - g5_support.good_action_num) DESC, (g5_member.write_num - g5_support.write_num) DESC");
이런식으로 직관적으로 짜봤는데 안되는듯 싶습니다.... 도움좀 주세요 ㅎ
답변 2
UNION 으로 하셔야 합니다.
한 조건문에 하나의 테이블을 호출하는게 정석이며
다 건의 테이블을 호출할려면 JOIN 을 써야 합니다.
당연히 위의 쿼리는 틀린 쿼리이구요
같은 조건의 다른 케이블을 같은 형식으로 구조를 맞춘 뒤
UNION으로 가져와서 정렬하는 방법이 있습니다.
(개인적으로 하나의 테이블에서 가져오는 데이터가 아닌 UNION 을 사용하는건 속도 이슈 등으로 인하여 추천하진 않습니다.)
테이블 구조를 제가 정확히 몰라 코드는 기입하지 않겠습니다만
UNION 사용 방법에 대한 링크만 남깁니다.
where 절에 join 조건이 없네요. 이럴 경우 카디션 곱으로 결과가 제대로 안나올 것 같습니다.
join 조건 맞춘 다음에, 인 타입이 1:1이 아니라면 group by로 묶어주고 select 절에서 write_num,reply_num, good_action_num를 각각 더하고 빼는 필드를 alias로 만든 다음, order by에서 그 alias 필드를 참조하는 건 어떨까요?
또는 쿼리는 멤버 쿼리에서만 하고 나머지는 서브 쿼리로 비교 필드만 가져오는 것도 가능할 듯 싶습니다.