테스트 사이트 - 개발 중인 베타 버전입니다

PHP SQL 질문 채택완료

와칸다포에버 4년 전 조회 2,986

</p>

<pre>
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
</pre>

<p>

 

 

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

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

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

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

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

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

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

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

답변 2개

채택된 답변
+20 포인트
플래토
4년 전

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

</p>

<p>

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

이렇게 하면될거 같은데요

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

와칸다포에버
4년 전
감사합니다

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

최근 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
로그인 후 평가할 수 있습니다

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

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

로그인