PHP SQL 질문

PHP SQL 질문

QA

PHP SQL 질문

답변 2

본문



SELECT
    SUM(IF(result = 1, 1, 0)) win_count,
    SUM(IF(result = 2, 1, 0)) fail_count,
    mb_id, mb_nick
FROM TABLE
WHERE result > 0
GROUP BY mb_id
ORDER BY idx, win_count DESC
LIMIT 30


 

 

명령어는 위와같이 했습니다.

문제는 해당 테이블에서 최근 30개만 추려서 win_count가 높은순으로 정렬하려고 합니당

해당 테이블에는 아이디가 중복으로 데이터가 입력되어있습니다. 그래서 중복을 거르기 위해서

GROUP BY를 사용했는데요.. 생각해보니 GROUP을 사용하면 데이터를 중복해서 가져오지않는데

최근 30개의 데이터에서 중복으로 같은 아이디가 5개가 있다면 5개 모두 가져와서 win_count를 더해줘야하는데

1개만 가져오는거 같더라구요..

하고자하는건 해당 테이블은 중복으로도 아이디값이 들어가지만 최근 30개를 가져와서 win_count, fail_count를 더한뒤, win_count가 높은순으로 정렬하고 중복을 걸러야하는건데.. 어렵네요 ㅜㅜ

이 질문에 댓글 쓰기 :

답변 2

실제 데이타를 좀 봐야 정확하겠지만



SELECT * FROM (
    SELECT 
       (SELECT COUNT(*) 
          FROM (SELECT * FROM TABLE ORDER BY idx DESC LIMIT 30) b
         WHERE b.result = 1 AND b.mb_id = a.mb_id
        ) win_count, 
       (SELECT COUNT(*) 
          FROM (SELECT * FROM TABLE ORDER BY idx DESC LIMIT 30) c
         WHERE c.result = 2 AND c.mb_id = a.mb_id
        ) fail_count, 
       mb_id, 
        mb_nick
    FROM 
        (SELECT * FROM TABLE ORDER BY idx DESC LIMIT 30) a
    GROUP BY a.mb_id
) X
ORDER BY win_count DESC

이렇게 하면될거 같은데요

최근 30개면

idx가 pk라고 하면

SELECT
    SUM(IF(result = 1, 1, 0)) win_count,
    SUM(IF(result = 2, 1, 0)) fail_count,
    mb_id, mb_nick
FROM ( select * from TABLE order by idx DESC limit 30) A
WHERE result > 0
GROUP BY mb_id
ORDER BY win_count DESC
LIMIT 30
답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
filter #sql ×
전체 728
© SIRSOFT
현재 페이지 제일 처음으로