2014-02-11 22 views
5

我想获得最高点行与行列和选择查询没有rownum = rownum + 1。我已经尝试了下面的查询,但我缺少的东西也链接http://sqlfiddle.com/#!2/fd7897/7排名用户由最大id和点,但(排名是错误的)

我在寻找每个接收者的最后一个入口的答案,这也是最高分入口rankwise:我真的很感激任何帮助。感谢提前。

像这样:

( '2', '4', '测试...', '2011-08-21 14时13分19秒', '40', '009') - --rank1

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

( '1', '3', '测试...', '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'); 
+1

+1的数据例如,小提琴,所有需要的细节:) –

+0

@JorgeCampos谢谢,但挣扎了精确的输出,子查询工作的一部分,而不是整个查询。 – jason

+0

我有点困惑。你为什么需要tblB和tblC? – Leo

回答

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; 
+0

先生,我试图在上面的语句之前添加'create view unique_users_ranks as',并且我得到'1349 - View的SELECT包含FROM子句中的子查询'我尝试了所有东西,但仍然被卡在视图部分。如何将其转换上面的查询到一个视图。这是我的最终目标。请帮助。 – jason

+0

我正在实施你所建议的所有观点和疑问,以及它的工作主席先生。你是最好的。再次感谢主席先生,当我卡住时,我会继续向你发问。再次感谢主席先生的所有帮助。我真的很感激他。 – jason

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  
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 | 
+----+--------+----------+----------+---------------------+--------+-------+------+ 
+0

但我无法在VIEW.Can中创建上述查询,可以将上述内容转换为视图 – jason

+0

@jason抱歉。我不知道你在VIEW中询问过一个查询。根据MySQL Manaul(https://dev.mysql.com/doc/refman/5.5/en/create-view.html),我们不能在VIEW中使用用户变量。 –