希望您能帮我解决以下问题。
我有一张名为'得分'其中列出了用户的分数以及获得分数所需的时间。
我想返回一个查询,告诉用户他们在排行榜上的位置。
表格概述
+----+---------+-------+------------+
| id | user_id | score | time_taken |
+----+---------+-------+------------+
| 2 | 8 | 2 | 2 |
| 3 | 9 | 2 | 3 |
| 4 | 10 | 0 | 2 |
| 5 | 11 | 2 | 3 |
+----+---------+-------+------------+
我有以下查询,它通过创建一个名为' position'的新行返回我需要的数据。在飞行中。
但是我很难在这个语句中添加一个where子句来返回给定用户id的位置列。
SELECT @rank:= 0;
SELECT @rank:= @rank + 1 as rank, s.* FROM (
SELECT user_id, score, time_taken
FROM scores
ORDER BY
score DESC, time_taken ASC
LIMIT 100
)s
SQL数据
CREATE TABLE `scores` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`score` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`time_taken` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`answers` text COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `scores_user_id_foreign` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `scores` (`id`, `user_id`, `score`, `time_taken`, `answers`, `created_at`, `updated_at`)
VALUES
(2, 8, '2', '2', '[{\"5\":\"17\"},{\"7\":\"26\"},{\"6\":\"21\"},{\"4\":\"16\"}]', '2015-11-04 17:26:46', '2015-11-04 17:26:46'),
(3, 9, '2', '3', '[{\"7\":\"25\"},{\"4\":\"14\"},{\"5\":\"17\"},{\"6\":\"22\"}]', '2015-11-04 17:28:47', '2015-11-04 17:28:47'),
(4, 10, '0', '2', '[{\"7\":\"25\"},{\"4\":\"13\"},{\"6\":\"21\"},{\"5\":\"17\"}]', '2015-11-04 17:29:02', '2015-11-04 17:29:02'),
(5, 11, '2', '3', '[{\"6\":\"22\"},{\"4\":\"13\"},{\"5\":\"18\"},{\"7\":\"25\"}]', '2015-11-04 17:29:17', '2015-11-04 17:29:17');
需要输出
我只想检索user_id及其在排行榜中的位置(由所有结果确定,按分数排序,按时间排序)。
+----------+---------+
| position | user_id |
+----------+---------+
| 3 | 9 |
+----------+---------+
我已经环顾四周,但似乎无法找到合适的答案。
非常感谢任何帮助。
答案 0 :(得分:0)
我认为你不需要做那个其他的潜艇:
SET @i = 0;
SELECT * FROM(
SELECT
@i:=@i+1 AS position,
t.*
FROM
scores AS t
ORDER BY score DESC, time_taken ASC
) positions
WHERE positions.position = 5
或者您可以使用偏移量进行限制。
SELECT
t.*
FROM
scores AS t
ORDER BY score DESC, time_taken ASC
LIMIT 8, 1
将返回第8位的人。
答案 1 :(得分:0)
我认为这就是你想要的:
SELECT COUNT(*) AS position, aa.id, aa.user_id, aa.score, aa.time_taken
FROM scores AS aa
WHERE aa.id <= (
SELECT id
FROM scores
WHERE user_id = 8
);
结果:
position id user_id score time_taken
1 2 8 2 2
答案 2 :(得分:0)
使用这里的反馈我已经用以下查询来查找嵌套子查询的结果。
SELECT @rank:= 0;
SELECT a.* FROM (
SELECT @rank:= @rank + 1 as rank, s.* FROM (
SELECT user_id, score, time_taken
FROM scores
ORDER BY
score DESC, time_taken ASC
LIMIT 100
)s
)a
WHERE a.user_id = x