在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_at
的DATETIME
列时才有效。
@DanielW。不必要。如果它是主键,它也应该与 id
一起使用。
@HonzaOne id 主键/自动增量不可靠。有人可以添加 M005
和 id 123
和 M006
和 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
这一行的id
like
SELECT id FROM table WHERE user_id = 'M001'
然后找到id
比使用上一个查询找到的行数更高的行数,像这样
SELECT count(*) FROM table WHERE id > 1
【讨论】:
以上是关于在MySql中的每个新用户之后计算表中的行/条目的主要内容,如果未能解决你的问题,请参考以下文章