MySql查询以计算每个用户的分数

问题描述 投票:0回答:1

查询需要计算每个用户的总积分。对于每个qid,时间较短的用户将获得一个积分,总积分是所有积分的总和。下面的查询只是返回每个用户的总尝试次数,需要一种返回积分的方法。

Incorrect Query=select user, count(*) from (select * from (select * from xyz order by 
time ASC) as temp1 group by temp1.user,temp1.qid) AS temp2 group by user

DB:

CREATE TABLE xyz (
id INT PRIMARY KEY AUTO_INCREMENT,
  user VARCHAR(20),
  time INT,
  qid INT
);

INSERT INTO xyz VALUES (    1  ,  'abc' ,  15  , 1);
INSERT INTO xyz VALUES (    2  ,  'abc' ,  6  , 1);
INSERT INTO xyz VALUES (    3  ,  'xyz' ,  11  , 1);
INSERT INTO xyz VALUES (    4  ,  'abc' ,  4  , 1);
INSERT INTO xyz VALUES (    5  ,  'xyz' ,  13  , 2);
INSERT INTO xyz VALUES (    6  ,  'abc' ,  11  ,2);
INSERT INTO xyz VALUES (    7  ,  'abc' ,  9  , 3);
INSERT INTO xyz VALUES (    8  ,  'xyz' ,  10  , 3);
INSERT INTO xyz VALUES (    9  ,  'xyz' ,  2  , 3);
INSERT INTO xyz VALUES (    10  ,  'xyz' ,  2  , 4);

预期输出:

 USER   Score
 abc    2
 xyz    2

输出说明:

For qid=1, abc has lower time so 1 point to abc
For qid=2, abc has lower time so 1 point to abc
For qid=3, xyz has lower time so 1 point to xyz
For qid=4, xyz has lower time so 1 point to xyz

sqlfiddle Link

mysql
1个回答
3
投票

您需要为每个qid查找用户成为“第一”用户的次数。这是一种方法:

select xyz.user, count(*) as score
from xyz join
     (select qid, min(time) as mintime
      from xyz
      group by qid
     ) q
     on xyz.qid = q.qid and xyz.time = q.mintime
group by xyz.user;
© www.soinside.com 2019 - 2024. All rights reserved.