在这种情况下,如何返回重复值的数量?

达尼洛

在mysql中,我有下表'Log':

id_user       cod          info
  1            A        random_info1
  1            A        random_info1
  1            A        random_info1
  1            A        random_info2
  1            B        random_info2
  1            B        random_info2
  1            B        random_info3
  1            B        random_info3
  2            A        random_info4
  2            A        random_info4
  2            B        random_info5
  2            B        random_info5
  2            B        random_info5
  2            B        random_info6

使用此查询:

SELECT
  id_user,
  SUM(cod = 'A') as A,
  SUM(cod = 'B') as B
FROM
  Log
GROUP BY
  id_user

我得到每个'id_user'每个'鳕鱼'出现的数量:

id_user        A       B
  1            4       4
  2            2       4

现在,加上前面的结果,我需要为每个“鳕鱼”再次出现我们已经看到的“ info”中的值的次数,例如:

id_user        A       B       A_repeated       B_repeated
  1            4       4          2                2
  2            2       4          1                2

id_user ='1'的A_repeated为2,因为random_info1首次出现后出现了两次。

id_user ='1'的B_repeated为2,因为random_info2和random_info3第一次(每个)第一次出现。

要获得这些结果,我需要在查询中进行哪些更改?

花哨的裤子

干得好 :)

SELECT
  id_user,
  SUM(cod = 'A') as A,
  SUM(cod = 'B') as B,
  SUM(cod = 'A' && is_repeating) AS A_repeating,
  SUM(cod = 'B' && is_repeating) AS B_repeating
FROM
(
select
l.*
, @is_repeating := if(@prev_id_user = id_user && @prev_cod = cod && @prev_info = info, 1, 0) as is_repeating
, @prev_id_user := id_user
, @prev_cod := cod
, @prev_info := info
from
Log l
, (select @prev_id_user:=null, @prev_cod:=null, @prev_info:=null, @is_repeating:=0) var_init
order by id_user, cod, id
) Log  
GROUP BY
  id_user

不过,我需要添加,我添加了按顺序使用的auto_increment列(这很重要!)。就像我在上面的评论中已经说过的那样,除非您指定数据库表的顺序,否则没有任何顺序。没有order by子句,即使看起来像可以,您也不能依靠select的相同顺序。

更新:

看来我误会了你一点。这是一个更正的版本,您期望的A_repeating结果为3:

SELECT
  id_user,
  SUM(cod = 'A') as A,
  SUM(cod = 'B') as B,
  SUM(cod = 'A' && is_repeating) AS A_repeating,
  SUM(cod = 'B' && is_repeating) AS B_repeating
FROM
(
select
l.*
, @is_repeating := if(@prev_id_user = id_user && @prev_cod = cod && @prev_info = info, 1, 0) as is_repeating
, @prev_id_user := id_user
, @prev_cod := cod
, @prev_info := info
from
Log l
, (select @prev_id_user:=null, @prev_cod:=null, @prev_info:=null, @is_repeating:=0) var_init
order by id_user, cod, info
) Log  
GROUP BY
  id_user

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在这种情况下如何返回 jinja 值?

在这种情况下如何避免代码重复问题?

如何在这种情况下,与流返回列表?

在这种情况下如何使用 python/selenium 将返回值传递给函数?

在这种情况下如何获取gridview单元的值

在这种情况下,如何更改变量的值?

在这种情况下如何撰写

在这种情况下如何不重复自己?相同但参数不同的C函数

在这种情况下,是否可以将两个单独的值返回给函数?

在这种情况下返回引用是否很好?

在这种情况下,为什么 GetExternalLoginInfoAsync() 返回 null?

为什么在这种情况下UniquelyReferencedNonObjC返回false?

为什么在这种情况下,andmap返回#t?

为什么在这种情况下isinstance()返回False?

如何返回指定返回值的子类型(在这种情况下为interface {})?

在这种情况下,如何返回对数组中元素的引用?

在这种情况下如何从 Laravel 中的控制器返回视图

在这种情况下无法获得布尔值

如何为“扩展”提供动态值?(或“在这种情况下如何扩展工作”?)

在这种情况下,如何通过匹配公共值来生成新的数据帧?

在这种情况下,如何将maxDiff值添加到ArrayList中?

在这种情况下如何设置默认表单控件值?

在这种情况下如何找到下一个值

在这种情况下如何使用decltype

在这种情况下数据绑定如何工作

如何使用lastInsertId在这种情况下?

在这种情况下,如何计算H的* VC尺寸*?

在这种情况下如何理解 rep() 的用法?

如何做到在这种情况下连接策略?