按用户ID和点排名用户但是(排名错误)

时间:2014-02-11 23:43:50

标签: mysql sql

我试图获得最高分行和排名并选择查询而不用rownum = rownum + 1.我已经尝试了下面的查询,但我遗漏了一些链接http://sqlfiddle.com/#!2/fd7897/7

我正在寻找每个接收器的答案,最后一个条目也是排名最高的分数:我非常感谢任何帮助。谢谢你。

这样的事情:

('2','4','test ...','2011-08-21 14:13:19','40','009')--- rank1

('4','2','test ...','2011-08-21 14:13:19','30','003')---- rank2

('1','3','test ...','2011-08-21 14:12:19','20','005')---- rank3

到目前为止

查询:

    SELECT * ,
            (select count(*)
             from  tblA u2
             where u2.points > u.points or
                   u2.points = u.points and u2.id <= u.id
            ) as rank
FROM (SELECT u.receiver, MAX(u.id) AS id
      FROM tblA u
      GROUP BY  u.receiver
    ) subset JOIN
    tblA u
    ON subset.receiver = u.receiver AND subset.id = u.id order by rank;

表:

CREATE TABLE if not exists tblA
(
id int(11) NOT NULL auto_increment ,
sender varchar(255),
receiver varchar(255),
 msg varchar(255),
 date timestamp,
  points int(255),
  refno varchar(255),
 PRIMARY KEY (id)
);

CREATE TABLE if not exists tblB
(
id int(11) NOT NULL auto_increment ,
sno varchar(255),
name varchar(255),
 PRIMARY KEY (id)
);

CREATE TABLE if not exists tblC
(
id int(11) NOT NULL auto_increment ,
data varchar(255),
  refno varchar(255),
  extrarefno varchar(255),
 PRIMARY KEY (id)
);


INSERT INTO tblA (sender, receiver,msg,date,points,refno ) VALUES
('1', '2', 'buzz ...','2011-08-21 14:11:09','10','001'),
('1', '2', 'test ...','2011-08-21 14:12:19','20','002'),
('4', '2', 'test ...','2011-08-21 14:13:19','30','003'),
('1', '3', 'buzz ...','2011-08-21 14:11:09','10','004'),
('1', '3', 'test ...','2011-08-21 14:12:19','20','005'),
('1', '4', 'buzz ...','2011-08-21 14:11:09','10','006'),
('1', '4', 'test ...','2011-08-21 14:12:19','20','007'),
('3', '4', 'test ...','2011-08-21 14:13:19','30','008'),
('2', '4', 'test ...','2011-08-21 14:13:19','40','009');



INSERT INTO tblB (sno, name ) VALUES
('1', 'Aa'),
('2', 'Bb'),
('3', 'Cc'),
('4', 'Dd'),
('5', 'Ee'),
('6', 'Ff'),
('7', 'Gg'),
('8', 'Hh');


INSERT INTO tblC (data,refno,extrarefno ) VALUES
('data1', '001', '101'),
('data2', '002', '102'),
('data3', '003', '103'),
('data4', '004', '101'),
('data5', '005', '102'),
('data6', '006', '103'),
('data7', '007', '101'),
('data8', '008', '101'),
('data9', '009', '101');

3 个答案:

答案 0 :(得分:2)

问题是子查询中的count(*)。将其更改为count(distinct receiver)

SELECT * ,
       (select count(distinct receiver)
        from  tblA u2
        where u2.points > u.points or
              u2.points = u.points and u2.id <= u.id
       ) as rank
FROM (SELECT u.receiver, MAX(u.id) AS id
      FROM tblA u
      GROUP BY  u.receiver
    ) subset JOIN
    tblA u
    ON subset.receiver = u.receiver AND subset.id = u.id
order by rank;

编辑:

要将其创建为MySQL视图,您必须在from子句中正确进行聚合:

SELECT * ,
       (select count(distinct receiver)
        from  tblA u2
        where u2.points > u.points or
              u2.points = u.points and u2.id <= u.id
       ) as rank
FROM tblA u
WHERE u.id = (select max(u2.id) from tblA u2 where u2.receiver = u.receiver)
order by rank;

答案 1 :(得分:1)

那怎么样?

SELECT a.*
FROM   tbla a,
       (SELECT receiver,
               Max(points) AS m
        FROM   tbla
        GROUP  BY receiver) AS b
WHERE  a.receiver = b.receiver
       AND a.points = b.m
ORDER  BY m DESC    

答案 2 :(得分:1)

请注意,MySQL的相关子查询性能较差。我认为跟随查询返回的结果与您和快速结果相同。

SELECT x.*, @ord := @ord + 1 AS rank
FROM (
    SELECT u.*
    FROM(SELECT u.receiver, MAX(u.id) AS id
          FROM tblA u
          GROUP BY  u.receiver
    ) subset INNER JOIN tblA u ON subset.receiver = u.receiver AND subset.id = u.id,
    (SELECT @ord := 0) init
    ORDER BY points DESC
) x
ORDER BY rank;
+----+--------+----------+----------+---------------------+--------+-------+------+
| id | sender | receiver | msg      | date                | points | refno | rank |
+----+--------+----------+----------+---------------------+--------+-------+------+
|  9 | 2      | 4        | test ... | 2011-08-21 14:13:19 |     40 | 009   |    1 |
|  3 | 4      | 2        | test ... | 2011-08-21 14:13:19 |     30 | 003   |    2 |
|  5 | 1      | 3        | test ... | 2011-08-21 14:12:19 |     20 | 005   |    3 |
+----+--------+----------+----------+---------------------+--------+-------+------+