Mysql Query以n * 2格式记录最大记录

时间:2014-10-06 10:32:37

标签: php mysql

我有records这样的表

---- ---------     ------
 id     name       points
---- ---------     ------
 1      aaaa         88
 2      bbbb         87
 3      cccc         88
 4      dddd         87
 5      eeee         86
 6      ffff         87
 7      gggg         87
 8      hhhh         85
 10     iiii         86
 11     iiii         86
 12     iiii         86
 13     iiii         86
 14     iiii         86
 15     iiii         86
 16     iiii         87
 17     iiii         82
 18     hhhh         85

形成表格,我想选择具有以下条件的记录

  1. 对于第一个最高记录,最高点将位于最前面。 (但只有一个记录)。我有两个最高点88的记录,这里应该显示最近的一个(最大ID)

  2. 从第二个记录开始,应以(n * 2)的格式检索字段。我的意思是,对于第二个最大记录,我可以允许4个值相等(2 * 2 = 4)。即在表中有几个87,但我只选择最近的4个记录(最大ID)。类似地,对于第3个最大值,我可以允许3 * 2 = 6个记录相同..等等..

  3. 目前,我已尝试

    select * from records group by points order by points desc
    

    但它仅限于同一条记录。是否有可能根据需要在此查询中使用count或任何其他相关函数。希望你帮帮我。

    编辑:

    输出应该是,

    ---- ---------     ------
     id     name       points
    ---- ---------     ------
     3      cccc         88      -- maximum (only one)
     16     iiii         87      |
     6      ffff         87      | -- 2nd maximum (allow 2*2 =4 only)
     7      gggg         87      |
     4      dddd         87      |
     15     iiii         86      |
     14     iiii         86      |
     13     iiii         86      | -- 3rd maximum (allow 3*2 =6 only)
     12     iiii         86      |
     11     iiii         86      |
     10     iiii         86      | and so on for 4th and 5th
     18     hhhh         85
     8      hhhh         85
     17     iiii         82
    

2 个答案:

答案 0 :(得分:2)

我会让你(其他人)弄清楚问题的最后部分......

CREATE TABLE my_table
(id     INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,name       VARCHAR(12) NOT NULL
,points INT NOT NULL
);

INSERT INTO my_table VALUES
(1      ,'aaaa',88),
(2      ,'bbbb',87),
(3      ,'cccc',88),
(4      ,'dddd',87),
(5      ,'eeee',86),
(6      ,'ffff',87),
(7      ,'gggg',87),
(8      ,'hhhh',85),
(10     ,'iiii',86),
(11     ,'iiii',86),
(12     ,'iiii',86),
(13     ,'iiii',86),
(14     ,'iiii',86),
(15     ,'iiii',86),
(16     ,'iiii',87),
(17     ,'iiii',82);

SELECT x.id
     , x.name
     , x.points
  FROM 
     ( SELECT *
            , IF(@prev=points,@i:=@i+1,@i:=1)i
            , IF(@prev<>points,@j:=@j+1,@j:=@j)j
            , @prev:=points 
         FROM my_table
            , (SELECT @i:=0,@j:=0,@prev:='')vars 
        ORDER 
           BY points DESC
            , id DESC
     ) x
 WHERE i <= j*2;

 +----+------+--------+
 | id | name | points |
 +----+------+--------+
 |  3 | cccc |     88 |
 |  1 | aaaa |     88 |
 | 16 | iiii |     87 |
 |  7 | gggg |     87 |
 |  6 | ffff |     87 |
 |  4 | dddd |     87 |
 | 15 | iiii |     86 |
 | 14 | iiii |     86 |
 | 13 | iiii |     86 |
 | 12 | iiii |     86 |
 | 11 | iiii |     86 |
 | 10 | iiii |     86 |
 |  8 | hhhh |     85 |
 | 17 | iiii |     82 |
 +----+------+--------+

答案 1 :(得分:2)

/*Sample data*/
CREATE TABLE t
    (`id` int, `name` varchar(9), `points` int)
;

INSERT INTO t
    (`id`, `name`, `points`)
VALUES

    ('1', 'aaaa', '88'),
    ('2', 'bbbb', '87'),
    ('3', 'cccc', '88'),
    ('4', 'dddd', '87'),
    ('5', 'eeee', '86'),
    ('6', 'ffff', '87'),
    ('7', 'gggg', '87'),
    ('8', 'hhhh', '85'),
    ('10', 'iiii', '86'),
    ('11', 'iiii', '86'),
    ('12', 'iiii', '86'),
    ('13', 'iiii', '86'),
    ('14', 'iiii', '86'),
    ('15', 'iiii', '86'),
    ('16', 'iiii', '87'),
    ('17', 'iiii', '82'),
    ('18', 'hhhh', '85')
;

/*Query*/
SELECT id, name, points FROM (
    SELECT
    t.*
    , @n := IF(@prev_points != points, @n + 1, @n) AS n
    , @row := IF(@prev_points != points, 1, @row + 1) AS row
    , @prev_points := points
    FROM
    t
    , (SELECT @prev_points := null, @n := 1, @row := 0) var_init_subquery
    ORDER BY points DESC, id DESC
) sq
WHERE row <= CASE WHEN n = 1 THEN 1 ELSE n * 2 END
;

/*Result*/
| ID | NAME | POINTS |
|----|------|--------|
|  3 | cccc |     88 |
| 16 | iiii |     87 |
|  7 | gggg |     87 |
|  6 | ffff |     87 |
|  4 | dddd |     87 |
| 15 | iiii |     86 |
| 14 | iiii |     86 |
| 13 | iiii |     86 |
| 12 | iiii |     86 |
| 11 | iiii |     86 |
| 10 | iiii |     86 |
| 18 | hhhh |     85 |
|  8 | hhhh |     85 |
| 17 | iiii |     82 |