mysql select 질문입니다.

mysql select 질문입니다.

QA

mysql select 질문입니다.

답변 2

본문

$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 사용 방법에 대한 링크만 남깁니다.

 

http://blog.bsmind.co.kr/entry/MySQL-Union-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%97%AC%EB%9F%AC-%ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%98-%EA%B0%99%EC%9D%80-%EA%B0%92%EC%9D%84-%ED%95%9C%EB%B2%88-%EC%BF%BC%EB%A6%AC%EB%A1%9C-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0 

 

where 절에 join 조건이 없네요. 이럴 경우 카디션 곱으로 결과가 제대로 안나올 것 같습니다.

join 조건 맞춘 다음에, 인 타입이 1:1이 아니라면 group by로 묶어주고 select 절에서 write_num,reply_num, good_action_num를 각각 더하고 빼는 필드를 alias로 만든 다음, order by에서 그 alias 필드를 참조하는 건 어떨까요?

또는 쿼리는 멤버 쿼리에서만 하고 나머지는 서브 쿼리로 비교 필드만 가져오는 것도 가능할 듯 싶습니다.

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 8
© SIRSOFT
현재 페이지 제일 처음으로