在MySql中的每个新用户之后计算表中的行/条目

Posted

技术标签:

【中文标题】在MySql中的每个新用户之后计算表中的行/条目【英文标题】:Count Row / Entry in table after each new user in MySql 【发布时间】:2021-09-07 11:06:29 【问题描述】:

我在数据库中有一个表,下面是表结构

id user_id
1 M001
2 M002
3 M003
4 M004

我想在每个新用户之后计算行/条目,意味着在 user_id M001 之后有 3 个条目,在 M002 之后有 2 个条目,在 M004 之后有 1 个条目,依此类推

需要一些 php 函数来计算每个用户之后的条目。

预期结果:

user_id > 该用户之后的条目

喜欢这个

M001 > 3
M002 > 2
M003 > 1
M004 > 0

我不知道该怎么做。

【问题讨论】:

这仅在您添加带有created_atDATETIME 列时才有效。 @DanielW。不必要。如果它是主键,它也应该与 id 一起使用。 @HonzaOne id 主键/自动增量不可靠。有人可以添加 M005 和 id 123M006 和 id 99。当你有一个副本集时,确定性就更差了。 我认为不需要日期时间,我只需要表中每个用户之后的条目计数,这是一个表,每个用户输入一次,M002 可能排在第一位 M003 可能排在第四位没关系,只需要计算每个用户之后的条目数。 @DanielW。你是对的。但它在技术上不也适用于created_at 列吗?我认为只有当您可以控制表结构以及插入的内容时它才能工作。但我完全同意添加DATETIME 列似乎是最合乎逻辑的解决方案。 【参考方案1】:

您可以使用row_number()id 进行反向排序,然后减去1

select t.*,
       (row_number() over (order by id desc) - 1) as entries_after
from t;

您也可以使用相关子查询来执行此操作。这不是特别有效,但对于小型数据集来说没问题:

select t.*,
       (select count(*) from t t2 where t2.id > t.id) as entries_after
from t;

【讨论】:

感谢它有效,请更新答案,因为它在将括号添加到 (row_number() over (order by id desc) - 1) 后给出别名错误 在本地主机上工作正常,但在服务器上出现错误 #1064 - 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册以获取正确的语法,以便在第 1 行主机服务器版本:5.7.23-23 - 1) 作为非工作列表限制 0、25 中的条目之后使用 'over (order by id desc) - 1) Percona 服务器 (GPL),第 23 版,修订版 500fcf5 @TauisifAhmad 。 . .这需要三年半前发布的 MySQL 8+。 还有其他选择吗?因为我的主机版本较低,请帮忙 在第二个查询中您使用 t 和 t2 但我只有一个表【参考方案2】:

我认为您应该考虑到表格通常没有默认顺序。因此,您应该定义“之后”的确切含义。如果这意味着用户是稍后添加的,您可以添加一个带有插入时间的 datetime 列,并查找具有较晚插入日期的行。

如果id 是主键,则对于新添加的行,它总是更高。因此,您可以利用它来发挥自己的优势,并简单地计算具有更高 id 的行。

所以你可以先找到user_id这一行的idlike

SELECT id FROM table WHERE user_id = 'M001'

然后找到id 比使用上一个查询找到的行数更高的行数,像这样

SELECT count(*) FROM table WHERE id > 1

【讨论】:

以上是关于在MySql中的每个新用户之后计算表中的行/条目的主要内容,如果未能解决你的问题,请参考以下文章

如果任何列与另一个表中的匹配行不同,如何插入行

自动将不同表中的 ID 号添加到新条目中?

跨数据库表中的行验证给定条件

SQL Server:从一个表中复制新添加的行并自动插入到另一个表中

根据另一个表中的条件计算表中的行数

删除不同表中的条目 MySQL 查询