【问题标题】:mysql how to get row position with where clausemysql如何使用where子句获取行位置
【发布时间】:2022-01-21 10:15:17
【问题描述】:

我有这样的数据

id  userid        phone
1   1000          11111
2   1001          22222
3   1000          33333
4   1000          44444
5   1001          55555
6   1000          66666

列电话是唯一的

我期待以下结果

position phone
3        44444

我尝试了 row_number 但它不起作用。

select *,row_number() over 
    (partition by userid order by id asc) as position 
from table 
where phone=44444

这种方式位置总是1

【问题讨论】:

  • 你对id的值感兴趣吗?您的语句中没有任何排序,因此无法保证返回的顺序。
  • row_number 在应用 WHERE 之后应用,因此您计算一行行集的位置。在 CTE 中使用枚举并在外部查询中使用过滤。
  • 我期待以下结果 对于指定的order by id ascphone=44444 的位置必须是 4,而不是 3...请仔细解释。
  • akira ,抱歉解释不好。我的意思是根据用户ID =手机用户ID的行列表询问计算位置。
  • select userid from table where phone=44444 将给出 1000,然后select * from table where userid=1000 将给出 ``` 1 1000 11111 3 1000 33333 4 1000 44444 6 1000 66666 ``` 表示 44444 行来第三

标签: mysql mariadb position row


【解决方案1】:

row_number() 根据WHERE 子句应用于结果集。由于您在该结果中只有一条记录,因此 row_number()1

您首先需要选择完整的集合,对其应用row_number(),然后获取带有搜索号码的记录

SELECT position,
       phone
       FROM (SELECT row_number() OVER (PARTITION BY userid
                                       ORDER BY id ASC) AS position,
                    phone
                    FROM elbat) AS x
       WHERE phone = 44444;

如果表很大,将派生表的结果限制为具有搜索号码的用户的记录可能会有所帮助。 (phone, userid) 上的索引和(userid, id, phone) 上的另一个索引可能支持这一点。

SELECT position,
       phone
       FROM (SELECT row_number() OVER (ORDER BY id ASC) AS position,
                    phone
                    FROM elbat
                    WHERE userid = (SELECT userid
                                           FROM elbat
                                           WHERE phone = 44444)) AS x
       WHERE phone = 44444;

【讨论】:

  • yes.table 非常大,像 2gb。
  • 我尝试了第二个查询,它有效。但是如果用户 ID 有太多记录,例如 200k 记录需要 8 秒才能完成,则执行时间会很长。你知道我应该在 mysql conf 文件中查看什么参数吗?
  • @korangu:我做了一个编辑建议索引。
  • 我已经在用户 ID 和手机上有 2 个单独的索引,如果我添加更多的索引表大小会变得更大。
  • @korangu:所以?当然索引需要空间,这没问题,现在磁盘空间很便宜。
猜你喜欢
  • 2016-09-12
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 2020-07-18
相关资源
最近更新 更多