Mysql 独特用户排名
如果我有三列: id、用户名、时间 我的数据是:Mysql 独特用户排名,mysql,sql,Mysql,Sql,如果我有三列: id、用户名、时间 我的数据是: +-------+------------------+-------------+ | id | username | time | +-------+------------------+-------------+ | 1 | A | 1 min | | 2 | A | 2 min | | 3 |
+-------+------------------+-------------+
| id | username | time |
+-------+------------------+-------------+
| 1 | A | 1 min |
| 2 | A | 2 min |
| 3 | B | 3 min |
| 4 | B | 4 min |
+-------+------------------+-------------+
此查询用于获取排名:
SELECT time,
FIND_IN_SET(MIN(time), (SELECT GROUP_CONCAT(time ORDER BY time ASC)
FROM table t1)) AS rank
FROM table t2
WHERE t2.username = 'B';
只有一个问题:它为用户B返回排名3de,而不是排名第二
所以我尝试使用GROUP BY t2.username和Distinct t2.username,但没有成功
如何获得用户B的排名?它应该是2而不是3,因为我们只有2个用户。例如:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL
,username CHAR(1) NOT NULL
,time TIME NOT NULL
);
INSERT INTO my_table VALUES
(1,'A','00:01:00'),
(2,'A','00:02:00'),
(3,'B','00:03:00'),
(4,'B','00:04:00');
SELECT * FROM my_table;
+----+----------+----------+
| id | username | time |
+----+----------+----------+
| 1 | A | 00:01:00 |
| 2 | A | 00:02:00 |
| 3 | B | 00:03:00 |
| 4 | B | 00:04:00 |
+----+----------+----------+
SELECT *
FROM
( SELECT username
, time
, @i:=@i+1 rank
FROM
( SELECT username
, MIN(time) time
FROM my_table
GROUP
BY username
) x
, (SELECT @i:=0) vars
ORDER
BY time
) n
WHERE username = 'B';
+----------+----------+------+
| username | time | rank |
+----------+----------+------+
| B | 00:03:00 | 2 |
+----------+----------+------+
我想这也行,但有点粗糙,所以我不确定
SELECT x.*
, FIND_IN_SET(time,(SELECT GROUP_CONCAT(DISTINCT time ORDER BY time) FROM (SELECT MIN(time) time FROM my_table GROUP BY username) j )) rank
FROM my_table x HAVING rank <> 0 AND username = 'B';
MIN对字符串不起作用,您需要强制转换它。@FunkFortyner MIN对字符串起作用,它的作用就像是ASC limit 1下的订单一样,$order的值是多少_by@JorgeCampos好啊嗯,我在这里看到了它,我引用:MIN函数在某些情况下非常有用,比如找到最小的数。。。不要提及字符串,也不知道为什么与官方引用$user_name相比,它同样毫无意义。摆脱所有的PHP。这与这个问题无关