2013-12-18 3 views
4

Я пытался создать один SQL-запрос, чтобы вернуть то, что мне нужно, вместо создания 2 запросов, но мне нужно использовать результат одного из запросов как offset другого.Как использовать результат выбора в качестве смещения в SQL-запросе

В моей таблице есть ответы пользователей с оценками, каждый пользователь может иметь несколько ответов в этой таблице. И я хочу рассчитать среднюю точку таблицы упорядоченных баллов.

Пример:

пользователь отвечает:

  1. пользователя 15 баллов
  2. пользователя 1 - 15 баллов
  3. пользователя 2 - 8 баллов
  4. пользователя 3 - 12 баллов

таблица рейтинга:

  1. пользователя 1 - 20 баллов
  2. пользователя 3 - 12 баллов < средняя точка
  3. пользователя 2 - 8 баллов

Решение:

Первый запрос вычисляет среднюю точку:

SELECT CEILING(count(Distinct(id_user))/2) as position 
FROM us_user_response 
where id_round=1 

Результат запроса:

позиций: 2

Этот второй запрос создает упорядоченную таблица рейтинга:

SELECT sum(points) as score 
FROM us_user_response 
where id_round=1 
GROUP BY id_user 
Order by score DESC 

Теперь я хочу создать одно би г-запрос, который возвращает оценку среднего пользователя, мне просто нужно использовать первый результат запроса в качестве offset второго запроса:

SELECT sum(points) as score 
     FROM us_user_response 
     where id_round=1 
     GROUP BY id_user 
     Order by score DESC LIMIT 1 
     OFFSET (SELECT CEILING(count(Distinct(id_user))/2) as position 
       FROM us_user_response where id_round=1) 

Конечно, это не работает, есть ли способ, чтобы использовать результат как offset?


EDIT:

Запросы работают хорошо! Мой вопрос в том, есть ли способ использовать результат запроса как смещение другого. Поэтому я мог бы выполнить это в одном запросе.

+0

Не можете также выбрать свой идентификатор пользователя, а затем использовать это? – Jessica

+0

Мне нужен средний балл ... единственный способ получить это, чтобы получить средний элемент упорядоченной таблицы ... –

+0

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

ответ

1

попробовать что-то вроде этого:

SET @line_id = 0; 
SET @line_offset = (
    SELECT CEILING(count(Distinct(id_user))/2) as position 
    FROM us_user_response 
    WHERE id_round = 1 
); 

SELECT sum(points) as score, 
    IF((@line_id := @line_id + 1) = @line_offset, 1, 0) AS useit 
FROM us_user_response 
WHERE id_round = 1 
GROUP BY id_user 
HAVING useit = 1 
ORDER BY score; 
+0

Он работает! хороший обходной путь! –

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