2015-11-04 23 views
0

希望您可以通过以下查询来帮助我。返回MYSQL查询中where行所在行的位置

我有一个叫做“分数”表,该表列出了用户的成绩,并实现在比分上所花费的时间。

我想返回的查询,告诉他们在什么位置的用户排行榜。

表概述

+----+---------+-------+------------+ 
    | id | user_id | score | time_taken | 
    +----+---------+-------+------------+ 
    | 2 |  8 | 2  | 2   | 
    | 3 |  9 | 2  | 3   | 
    | 4 |  10 | 0  | 2   | 
    | 5 |  11 | 2  | 3   | 
    +----+---------+-------+------------+ 

我有以下查询将返回我需要创建一个新的行呼吁飞“位置”的数据。

但我很努力地添加一个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

嘿@KostasMitsarakis当然。 我只想检索user_id和它们在排行榜内的位置(由所有结果确定,按分数排序,按时间排序)。我用示例输出更新了问题。 – user3118689

+0

将它作为子查询包装起来,然后用user_id和你想要的位置添加一个where子句; –

回答

0

我不认为你需要做的其他子:

SET @i = 0; 
SELECT * FROM(
    SELECT 
     @i:[email protected]+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

+0

你应该考虑使用HAVING –

0

我想这是你想要什么:

SQL Fiddle

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

这个查询的问题是我需要首先按照DESC,time_taken ASC的顺序列出数据并为每个结果添加一个位置。一旦我计算了这个我然后需要查询来查找用户ID。 我已经用一个返回所需数据集的查询更新了描述上的查询。我现在需要将其过滤以返回所选用户标识的位置。但是,当我添加一个where子句时,我一直放松位置值,或者它不应该返回1。 – user3118689

+0

哦,你必须在第一个地方写下这个信息..我已经理解了别的东西。 –

0

使用反馈h在我使用以下查询嵌套子查询后,我已经实现了我所期望的结果。

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

感谢@KostasMitsarakis – user3118689