#mysql #count
#mysql #подсчет
Вопрос:
Я запускаю следующий запрос, чтобы понять, как получить первую попытку пользователей ответить на вопрос, указанный рядом с их второй попыткой.
SELECT
s.id AS attempt_id_first, m.id AS attempt_id_second, s.user_id
FROM
attempt s
INNER JOIN attempt m on s.user_id = m.user_id
WHERE
s.id<m.id
В итоге я получаю это:
attempt_first attempt_second user_id
7 17 1
9 10 2
9 15 2
10 15 2
4 6 9
24 25 15
29 34 19
29 36 19
34 36 19
Я хотел бы иметь новый столбец, который подсчитывает количество попыток пользователей, чтобы:
7 17 1 1
9 10 2 3
9 15 2 3
10 15 2 3
4 6 9 1
24 25 15 1
29 34 19 3
29 36 19 3
34 36 19 3
Я уверен, что это тривиально, но я не могу заставить это работать. Кому-нибудь помочь?
Комментарии:
1. Я думаю, вам нужно найти способ отформатировать это лучше. Неважно — это исправлено.
Ответ №1:
Я думаю, что это все: просто отобразите результаты и введите дополнительный подзапрос count:
select
userid,
id,
(select
count('x')
from
attempt x
where
x.userid = a.userid) as attempcount
from
attempt a
Если вы хотите сохранить первую и вторую попытку в отдельных столбцах, вы, конечно, можете встроить подвыборку в свой исходный запрос.
Однако это кажется неправильным. Во-первых, у вас должно быть как минимум две попытки, иначе ни одна не отобразится. Вы можете решить эту проблему, изменив inner join
на left join
и переместив условие в where
предложении в это объединение. Во-вторых, «вторая попытка» — это не вторая попытка за высказывание. На самом деле, для каждой из попыток вы получаете все последующие попытки. Посмотрите на пример пользователя 2. Вы случайно получаете три строки (где есть три попытки), но вы получаете попытки 9 и 10, а также попытки 9 и 15, а также 10 и 15. 9, 15 неверно, поскольку 15 не является попыткой, которая следовала за 9. Чем больше попыток у пользователя, тем больше таких ложных результатов вы получите.
Комментарии:
1. Увы, это не отвечает на вопрос. Ваш запрос сильно отличается от запроса операционной системы.
2. @GordonLinoff Существует проблема с запросом первого и второго элемента, поскольку способ, которым OP делает это, вы получаете любой следующий элемент. Тем не менее, в примере данных, который он приводит, возникает та же проблема. Я попытался решить эту проблему и допустил возможность того, что OP может вообще не захотеть / нуждаться в запросе первой и второй попытки (зачем вам, если вы также возвращаете вторую попытку в отдельной строке).
3. @GordonLinoff Но вместо того, чтобы признать ошибку OP и мою мысль по этому поводу, вы просто отправляете запрос, который не возвращает список, запрошенный OP (так что это тоже неправильно), но также не показывает никаких объяснений или мотивации. И затем вы публикуете отрицательный комментарий к моему ответу (снова!), чтобы привлечь больше внимания к вашему?
Ответ №2:
Если вы хотите, чтобы одна попытка была указана рядом со следующей с указанием количества, я бы предложил:
SELECT s.user_id, s.id AS attempt_id_first,
(select s2.id
from attempt s2
where s2.user_id = s.user_id and
s2.id > s.id
order by s2.id
limit 1
) as attempt_id_second,
(select count(*)
from attempt s3
where s3.user_id = s.user_id
) as totalAttempts
FROM attempt s ;
Здесь перечисляется каждая попытка только один раз со следующей. Количество включается в качестве последнего столбца.