【问题标题】:How to get row position in MySQL?如何在 MySQL 中获取行位置?
【发布时间】:2013-05-11 17:55:25
【问题描述】:

首先,我尝试用谷歌搜索,但只得到了这样的答案: MySQL - Get row number on select

我需要的是“通过特定 id 获取行位置”。

通过上面链接中的示例,我尝试添加“WHERE CLAUSE”,但是“rank”的结果始终为 1。

所以,如果我的表有自增 id 字段,并且没有按特定顺序(例如,在 id 1 之后是 3,而不是 2,因为 id 2 已从数据库中删除),我如何获得 for示例 ID 4?

有什么办法可以得到,我想要什么?

【问题讨论】:

  • 只是想知道,您需要这些信息做什么?
  • 我不完全理解这个问题。你想对结果进行排序吗?或者通过他们的 ID 获取某些行?代码示例会有所帮助。
  • SQL中没有行“定位”的概念。
  • @JosiahSouth 不,我不想对结果进行排序。我需要知道表中具有特定 ID 的行的位置。例如,我有 tv_channels 表。在该表中,我有 3 行。每行有 2 个字段:id 和 name。第一行的 ID 为 1,名称为 BBC。第二行的 ID 为 3,名称为 Discovery。第三行的 ID 为 4,名称为 MTV。如何获得频道 Discovert 的第二排位置。这个位置应该是 2 号。
  • 正如@EvanMulawski 所说(这就是我感到困惑的原因)SQL 中没有定位的概念。我建议阅读 SQL。无意冒犯。

标签: mysql sql database


【解决方案1】:

对于基于 1 的位置:

SELECT COUNT(id) AS pos FROM table WHERE id <= current_id

对于从 0 开始,将

【讨论】:

  • 对于基于 0 的,将 &lt;= 更改为 &lt;
  • 你能在你的答案中添加你的评论吗?
  • 您可以这样做,但将其添加到您的答案中会改善您的答案。
  • 你说得对...我是新来的,只是还不知道如何使用所有功能...谢谢...
  • 没问题。您可以随时编辑自己的问题和答案。你可以去here to learn about other privileges
【解决方案2】:

假设“位置”是指由id 订购时:

SELECT COUNT(*) FROM my_table WHERE id <= 4

【讨论】:

  • @eggyal 优秀
【解决方案3】:

看看这些SQL Fiddle

CREATE TABLE league_girl (position int, username varchar(10), score int);
INSERT INTO league_girl VALUES (1, 'a', 10);
INSERT INTO league_girl VALUES (2, 'b', 25);
INSERT INTO league_girl VALUES (7, 'c', 75);
INSERT INTO league_girl VALUES (10, 'd', 25);
INSERT INTO league_girl VALUES (16, 'e', 55);
INSERT INTO league_girl VALUES (17, 'f', 80);
INSERT INTO league_girl VALUES (27, 'g', 15);

这个查询给了我record position = 17 和它的6th Row Number

Select * from (SELECT  l.position, 
        l.username, 
        l.score,
        @curRow := @curRow + 1 AS row_number
FROM    league_girl l
JOIN    (SELECT @curRow := 0) r) as k
WHERE   k.position = 17;

【讨论】:

    【解决方案4】:

    如果你的意思是,MySQL 没有任何查找row number 的功能

    【讨论】:

      【解决方案5】:

      我需要一些非常相似但更通用的东西。我有几个 order 子句的 select 查询,我需要在结果集中找到特定 id 的位置。想象一个经过过滤的产品列表和一组过滤器,您需要找到产品所在的页面。

      基于 Henrique Barcelos 解决方案:

      原始查询:

      SELECT * FROM mytable 
      WHERE something = TRUE
      ORDER BY 
          price ASC, 
          discount DESC, 
          catagory ASC
      

      查找特定id的行查询:

      SELECT COUNT(id) FROM mytable
      WHERE something = TRUE
      AND (
          price < 'myprice'
          OR (price = myprice AND discount > 'mydiscount')
          OR (price = myprice AND discount = 'mydiscount' AND category < 'mycategory')
      )
      

      你必须得到你需要得到第一个位置的对象的mypricemydiscountmycategory

      您可以使用小于 () 的降序。

      这个查询可以很容易地通过算法生成。

      它也比使用变量@curRow 的解决方案更节省资源,因为它不需要获取行并且可以仅从索引计算结果。

      【讨论】:

        【解决方案6】:
        SET @curRow = 0;
        SELECT *, @curRow := @curRow + 1 row FROM `table`
        

        如果您想将真实订单作为值存储在表中,您可以添加新列,例如行,然后

        set @curRow = 0;
        update `table` set row = @curRow := @curRow + 1;
        

        或者如果你想清除差距,你可以更新主键(如果保存更改id,例如如果它只是单独的测试表)

        【讨论】:

          猜你喜欢
          • 2011-04-06
          • 2013-01-03
          • 2020-09-21
          • 1970-01-01
          • 2021-02-13
          • 1970-01-01
          • 2011-10-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多