使用where子句

时间:2015-11-04 18:50:17

标签: mysql

希望您能帮我解决以下问题。

我有一张名为'得分'其中列出了用户的分数以及获得分数所需的时间。

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

表格概述

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

我已经环顾四周,但似乎无法找到合适的答案。

非常感谢任何帮助。

3 个答案:

答案 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)

我认为这就是你想要的:

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

答案 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