앱개발자1
20
2019-02-27 20:40:49
2
311

mysql 까다로운 랭킹 쿼리 궁금합니다.


안녕하세요.

mysql에서 랭킹 구하는 쿼리를 만들고 있는데, 원하는 결과가 나오질 않네요..조건이 복잡해서 질문 올립니다.

< 유저 정보 테이블의 컬럼 >

유저 고유번호(VARCHAR), 유저 닉네임(VARCHAR)


< 활동 내역 테이블의 컬럼 >

유저 고유번호(VARCHAR), 컨텐츠 고유번호(INT),  점수(BIGINT), 등록 시간(DATETIME)


활동 내역 테이블은 유저 고유번호 당 20개가 있습니다(컨텐츠 고유번호가 20개라..).

점수가 같으면 등록시간이 빠른게 높은 순위가 됩니다.

여기서 특정 컨텐츠 3개의 랭킹(순위, 닉네임, 점수 출력)을 1위부터 10위까지, 그리고 내 순위와 점수를 구하려고 쿼리문을 작성하고 있습니다. 랭킹은 주간별로 매겨지며 첫 주의 시작은 월요일입니다.

주간 랭킹이자 실시간 랭킹이죠.

먼저 순위부터 구하려고 다음과 같은 쿼리문을 작성했더니 결과가 영 이상하게 나오네요.


SELECT t1.유저 고유번호, t1.컨텐츠 고유번호, t1.점수, t1.등록 시간, COUNT(t2.점수) + 1 AS rank FROM A_U_B AS t1 LEFT JOIN A_U_B t2 ON t1.점수 > t2.점수 AND t1.컨텐츠 고유번호 = t2.컨텐츠 고유번호

 WHERE WEEK(CURDATE(), 1) = WEEK(t1.등록 시간, 1) AND YEAR(CURDATE()) = YEAR(t1.등록 시간) AND (t1.컨텐츠 고유번호 = 12 OR t1.컨텐츠 고유번호 = 15 OR t1.컨텐츠 고유번호 = 18)

 AND WEEK(CURDATE(), 1) = WEEK(t2.등록 시간, 1) AND YEAR(CURDATE()) = YEAR(t2.등록 시간) AND (t2.컨텐츠 고유번호 = 12 OR t2.컨텐츠 고유번호 = 15 OR t2.컨텐츠 고유번호 = 18)

 GROUP BY t1.유저 고유번호, t1.컨텐츠 고유번호, t1.등록 시간, t1.점수


이렇게 하니까 유저 고유번호가 한 명이 뜨고, 랭킹도 제대로 안나오더라구요...

(게다가 쿼리 효율도 최악이네요)

그림을 만들었는데 업로드가 안 되어서 글로 씁니다.

원하는 결과는


컨텐츠 12 버튼 / 컨텐츠 15 버튼 / 컨텐츠 18 버튼

각 컨텐츠 버튼을 누르면 아래에

내 순위 : 50 위 / 점수 : 10 점

순위 / 닉네임 / 점수 / 등록 시간

1 / 가가 / 133410 / 2019-02-27 01:01:01

2 / 가나 / 129409 / 2019-02-27 11:02:34

3 / 가다 / 126408 / 2019-02-25 01:01:01

4 / 가라 / 126408 / 2019-02-27 01:01:01 (같은 점수는 등록시간이 빠른 시간이 우선)

5 / 가마 / 124407 / 2019-02-28 01:01:01

6 / 가바 / 123998 / 2019-02-27 01:01:01

7 / 가사 / 123238 / 2019-02-27 01:01:01

8 / 가아 / 120014 / 2019-02-27 01:01:01

9 / 가자 / 113403 / 2019-02-27 01:01:01

10 / 가차 / 100002 / 2019-02-27 01:01:01


이런 식으로 나와야 합니다.

월요일 00:00:00에 조회하면 조회 개수가 0이 나올 수도 있고, 최대 33개(컨텐츠 3개에 각 건텐츠 1 ~ 10위, 나의 순위)

의 결과가 나오게 하려면 어떻게 짜야 하는지 도움을 요청드립니다..


0
0
  • 답변 2

  • 사는게힘듭니다
    2019-02-27 20:45:58
    create구문 한번 줘보시겠어요? 제가 오라클 복습중인데 한번해볼게요.
    0
  • 앱개발자1
    20
    2019-02-27 21:18:16

    CREATE TABLE IF NOT EXISTS `AB` (

      `user_num` varchar(25) NOT NULL COMMENT '유저 고유 정보',

      `c_n` tinyint(3) unsigned NOT NULL COMMENT '도전 번호',

      `b_c` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '일일 도전한 횟수',

      `b_p` bigint(20) NOT NULL DEFAULT '0' COMMENT '점수',

      `b_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '마지막 도전 시간'

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='유저 도전 상황 관리 테이블';


    INSERT INTO `AB` (`user_num`, `c_n`, `b_c`, `b_p`, `b_time`) VALUES

    ('11', 1, 0, 0, '2019-02-25 16:59:07'),

    ('11', 2, 0, 0, '2019-02-25 16:59:07'),

    ('11', 3, 0, 0, '2019-02-25 16:59:07'),

    ('11', 4, 0, 0, '2019-02-25 16:59:07'),

    ('11', 5, 0, 0, '2019-02-25 16:59:07'),

    ('11', 6, 0, 0, '2019-02-25 16:59:07'),

    ('11', 7, 0, 0, '2019-02-25 16:59:07'),

    ('11', 8, 0, 0, '2019-02-25 16:59:07'),

    ('11', 9, 0, 0, '2019-02-25 16:59:07'),

    ('11', 10, 0, 0, '2019-02-25 16:59:07'),

    ('11', 11, 0, 0, '2019-02-25 16:59:07'),

    ('11', 12, 0, 110, '2019-02-25 16:59:07'),

    ('11', 13, 0, 0, '2019-02-25 16:59:07'),

    ('11', 14, 0, 0, '2019-02-25 16:59:07'),

    ('11', 15, 0, 20, '2019-02-25 16:59:07'),

    ('11', 16, 0, 0, '2019-02-25 16:59:07'),

    ('11', 17, 0, 0, '2019-02-25 16:59:07'),

    ('11', 18, 0, 0, '2019-02-25 16:59:07'),

    ('11', 19, 0, 0, '2019-02-25 16:59:07'),

    ('11', 20, 0, 0, '2019-02-25 16:59:07'),

    ('22', 1, 0, 0, '2019-02-12 04:31:30'),

    ('22', 2, 0, 0, '2019-02-12 04:31:30'),

    ('22', 3, 0, 0, '2019-02-12 04:31:30'),

    ('22', 4, 0, 0, '2019-02-12 04:31:30'),

    ('22', 5, 0, 0, '2019-02-12 04:31:30'),

    ('22', 6, 0, 0, '2019-02-12 04:31:30'),

    ('22', 7, 0, 0, '2019-02-12 04:31:30'),

    ('22', 8, 0, 0, '2019-02-12 04:31:30'),

    ('22', 9, 0, 0, '2019-02-12 04:31:30'),

    ('22', 10, 0, 0, '2019-02-12 04:31:30'),

    ('22', 11, 39, 108, '2019-02-26 19:57:26'),

    ('22', 12, 1, 1, '2019-02-27 03:15:31'),

    ('22', 13, 82, 1, '2019-02-18 00:24:00'),

    ('22', 14, 0, 2, '2019-02-26 19:14:01'),

    ('22', 15, 1, 22, '2019-02-27 03:15:48'),

    ('22', 16, 0, 0, '2019-02-20 00:08:46'),

    ('22', 17, 0, 0, '2019-02-26 20:43:03'),

    ('22', 18, 0, 12325, '2019-02-25 23:34:15'),

    ('22', 19, 0, 0, '2019-01-28 06:15:04'),

    ('22', 20, 0, 0, '2019-01-28 06:15:04');

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.