2015-01-10 3 views
1

Я использую MySQL для решения этой проблемы. Мне нужно дать очки пользователю, основанному на общем времени, проведенном им по вопросу. Я рассчитал время, потраченное на пользователя. Скажем, это находится в user_time таблица.MySQL: диапазон на основе строк во внешней таблице

user_id question_id time_spent 
     1   1   7 
     1   2   50 
     2   1   11 

Мои точки диапазона на основе:

[0-10) seconds: 100 points, 
[10-20) seconds: 300 points, 
[20-30) seconds: 500 points, 
[30, inf): 1000 points 

Точные 10 секунд будет принести мне 300 очков. Хотя изменения точного числа были бы низкими, учитывая, что я вычисляю из разницы системных часов.

Эта информация в настоящее время забил во внешней таблице points_table

time_spent points 
0   100 
10   300 
20   500 
30   1000 

Мне нужен запрос, который выясняет, какой диапазон секунды принадлежит и дать мне этот результат.

user_id question_id points 
1  1   100 
1  2   1000 
2  1   300 

Я пробовал думать о разных типах соединений, но не мог думать о том, кто ответит на это конкретное требование.

+0

Что вы пробовали? –

+0

составляет 20 секунд 300 баллов или 500 баллов – Strawberry

ответ

1

Я думаю, что самый простой подход - это коррелированный подзапрос. Что-то вроде этого:

select ut.*, 
     (select pt.points 
     from points_table pt 
     where pt.time_spent <= ut.time_spent 
     order by pt.time_spent desc 
     limit 1 
     ) as points 
from user_time ut 
+0

Обновлен вопрос - добавлен дополнительный слой, который, вероятно, усложнял вещи –

+0

Я думаю, что я сделал неправильное соединение как предшественник этого шага. Изменен весь мой код, чтобы сначала выполнить соединения, а затем выполнить этот коррелированный подзапрос - я думаю, что он будет работать правильно. Извините за всю путаницу и спасибо за помощь! –

0

Попробуйте это:

SELECT ut.user_id, ut.time_spent, A.points 
FROM user_time ut 
INNER JOIN (SELECT p1.time_spent AS time_spent1, 
        p2.time_spent AS time_spent2, 
        p1.points 
      FROM points_table p1 
      INNER JOIN points_table p2 ON p1.time_spent < p2.time_spent 
      GROUP BY p1.time_spent 
      ) AS A ON ut.time_spent BETWEEN A.time_spent1 AND A.time_spent2 
+0

Разве вы не считаете, что противник Гордона менее сложный, делая то же самое? –

+0

Я согласен с @ jQuery.PHP.JAVA.net. Мне не нужно присоединяться к point_table. 2 таблицы независимы –

0

С другой стороны взять на себя это, вы могли бы добиться того же результата, не имея точек таблицы:

SELECT *, 
    CASE 
    WHEN time_spent >= 30 THEN 1000 
    WHEN time_spent >= 20 THEN 500 
    WHEN time_spent >= 10 THEN 300 
    ELSE 100 
    END 'Points' 
FROM user_time; 
+0

Да, мы также подумали об этом подходе, но не хотели его жестко кодировать в запросах, если мы должны его изменить позже. –

+0

Делает совершенный смысл и является тем, что я рассматривал. Просто хотел предоставить дополнительный способ взглянуть на него. –

Смежные вопросы