没有分组的MySQL计数

时间:2014-07-02 20:51:02

标签: mysql count

我正在运行以下查询以了解如何获取用户'首先尝试回答第二次尝试旁边列出的问题。

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

我确信这是微不足道的,但我无法让它发挥作用。帮助任何人?

2 个答案:

答案 0 :(得分:1)

我认为就是这样:只显示结果,并输入一个额外的计数子查询:

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 :(得分:0)

如果您想在下一个旁边列出一次尝试,并且计数,我会建议:

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 ;

这仅列出下一次尝试的每次尝试。计数包含在最后一栏中。