zoukankan      html  css  js  c++  java
  • MySQL 游戏排行榜

    今天在坛子上看到了,顺便写下来。
    有两种方法:
    1、效率不高,因为有子查询。但是简洁。而且我对SOCRES表做了INDEX。所以性能上也差不了多少。
    mysql> show create table scoresG
    *************************** 1. row ***************************
           Table: scores
    Create Table: CREATE TABLE `scores` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `score` int(11) DEFAULT '0',
      PRIMARY KEY (`id`),
      KEY `k_s` (`score`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
    1 row in set (0.00 sec)
     
    mysql> select count(1) from scores;
    +----------+
    | count(1) |
    +----------+
    |  1000000 |
    +----------+
    1 row in set (0.00 sec)
     
     
    mysql> select id,score,(select count(1) from scores where score>= (select score
    from scores where id = 100 order by score desc limit 1)) as rank from scores whe
    re id = 100;

    +-----+-------+--------+
    | id  | score | rank   |
    +-----+-------+--------+
    | 100 |    64 | 370311 |
    +-----+-------+--------+
    1 row in set (1.05 sec)
     
    2、分句完成。效率高。
    存储过程:
    DELIMITER $$
    DROP PROCEDURE IF EXISTS `test`.`sp_rank`$$
    CREATE PROCEDURE `test`.`sp_rank`(IN str_id int(11))
    BEGIN
      -- user's score
      DECLARE str_score int;
      -- user's rank
      DECLARE rank int;
      select score from scores where id = str_id order by score desc limit 1 into str_score ;
      select count(*) from scores where score >=str_score into rank;
      -- output
      select id,score,rank from scores where id = str_id;
    END$$
    DELIMITER ;
     
    mysql> call sp_rank(100);
    +-----+-------+--------+
    | id  | score | rank   |
    +-----+-------+--------+
    | 100 |    64 | 370311 |
    +-----+-------+--------+
    1 row in set (1.02 sec)

    Query OK, 0 rows affected (1.02 sec)

  • 相关阅读:
    回老家
    防疫针
    平安夜
    虎威威
    圣诞联欢会
    小老虎飞船
    电子积木
    打印
    周日大悦城
    又一年毕业季
  • 原文地址:https://www.cnblogs.com/jkred369/p/4581820.html
Copyright © 2011-2022 走看看