【问题标题】:sql - get row position as a result [duplicate]sql - 结果获取行位置[重复]
【发布时间】:2014-07-05 08:01:30
【问题描述】:

试图弄清楚如何在结果集中包含行位置的返回值。这是一个非常简单的表,由computer_id 使用 WHERE 子句进行排序。我正在寻找的只是每个结果中的(*row position*) as position

我通过在 SO 上搜索找到了一些东西,但没有任何东西可以开始工作。

$stmt = $db->prepare("
    SELECT *
    FROM computers
    WHERE account_id = :account_id
    ORDER BY computer_id    
");

$stmt->bindValue( ':account_id', $_SESSION['user']['account_id'] );
$stmt->execute();   

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo '<pre>',print_r($results,1),'</pre>';

【问题讨论】:

  • 我猜你是在询问查询返回的每一行的行号?
  • 此表的自动递增键字段是否会与您的数据行不明确匹配,或者您是否 gasp 完成了删除操作并使您的键与行位置不同步?跨度>

标签: mysql sql


【解决方案1】:

由于这是 PHP,您可以只创建一个变量,遍历结果并在执行过程中递增变量。

还有这个:ROW_NUMBER() equivalent in MySQL for inserting

这会得到类似于 MS SQL 中的 row_number() 的东西。

【讨论】:

  • 对于这种情况,我不能这样做。我正在使用第三方脚本 - DataTables。
【解决方案2】:

你可以在一个查询中做你想做的事(引用的重复问题没有做):

SELECT (@rn := @rn + 1) as rownumber, c.*
FROM computers c cross join
     (select @rn := 0) var
WHERE account_id = :account_id
ORDER BY computer_id;

要获取所有行的行号,请使用子查询:

SELECT c.*
FROM (SELECT (@rn := @rn + 1) as rownumber, c.*
      FROM computers c cross join
           (select @rn := 0) var
      ORDER BY computer_id
     ) c
WHERE account_id = :account_id;

请注意,这将花费更多时间,因为它必须处理整个表。

【讨论】:

  • 这是有效的,但是在按其他列排序时,我丢失了正确的顺序。是否可以通过 computer_id 将行号设置为它自己的表,其中该引用始终是正确的行号?希望这是有道理的。
  • 第二个选项对我有用,尽管行号已关闭。例如,我在computers.. 中有 10 个条目。前 6 个属于 account_id = 1,后 4 个属于 account_id = 2。显示第二个帐户是正确的,但行号从 7...8 开始, 9,10 而不是 1,2,3,4。想法?
  • 我能够通过将 where 子句移动到 select 语句中来解决我提到的问题......它也不会以这种方式处理整个表。
猜你喜欢
  • 2017-04-23
  • 2013-07-28
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多