이전 목록 다음
채택완료

PHP SQL 질문

Copy
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개 / 댓글 1개

채택된 답변
+20 포인트

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

Copy
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개

감사합니다

최근 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

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

🐛 버그신고