2014-02-10 4 views
1

Как я могу ранжировать пользователей ниже на основе баллов. Я действительно ценю любую помощь. Спасибо заранее.ранжировать пользователей на основе баллов

http://sqlfiddle.com/#!2/374db/11

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 varchar(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','20','008'), 
('2', '4', 'test ...','2011-08-21 14:13:19','20','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'); 

SQL

SELECT * 
FROM (SELECT tblA.receiver, MAX(tblA.id) AS id 
     FROM tblA 
     GROUP BY tblA.receiver 
    ) subset JOIN 
    tblA 
    ON subset.receiver = tblA.receiver AND subset.id = tblA.id JOIN 
    tblB 
    on tblA.receiver = tblB.sno join 
    tblC 
    ON tblA.refno=tblC.refno ; 
+1

Можете ли вы лучше объяснить свою схему и данные? Названия ваших супер-общих таблиц не дают нам большого понимания того, что ваш запрос действительно делает и почему это может быть неправильно. Какой результат вы получаете от своего запроса сейчас, и какой результат вы ищете? –

+0

почему column - это пользователи? – malta

+0

Является ли ранг основанием на сумме очков на одну запись или отправителя tblA? Взгляните на плотный ранг() (по пунктам). Это может быть то, что вам нужно. –

ответ

0

Вы можете заказать результаты запроса с помощью ORDER BY. Таким образом, вы можете ранжировать строки в TBLA следующим образом:

SELECT * 
FROM tblA 
ORDER BY points 

Однако, я заметил, что вы используете VARCHAR для столбца точек. Если это должно содержать числовое значение, вы, вероятно, хотите int или float.

+0

может использовать 'ORDER BY CAST (точки AS UNSIGNED) DESC', но я хочу, чтобы сделать это, поэтому я хочу запросить что-то вроде этого' CREATE VIEW v AS SELECT name, (выберите count (*) из пользователей u2 где u2.points> u.points или u2.points = u.points и u2.sno <= u.sno ) в качестве ранга FROM 'users' u;' хотя следующий запрос будет работать, я не могу преобразовать это во внимание: 'CREATE VIEW v AS SELECT name, points, sno, @ rownum: = @rownum + 1 AS rank ОТ пользователей, (выберите @rownum: = 0) GROUP BY имя, sno ORDER BY CAST (точки AS UNSIGNED) DESC; ' – jason

Смежные вопросы