Количество MySQL без группировки

#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 ;
  

Здесь перечисляется каждая попытка только один раз со следующей. Количество включается в качестве последнего столбца.