【问题标题】:PHP MySQL - Find Row IDPHP MySQL - 查找行 ID
【发布时间】:2012-03-09 23:31:26
【问题描述】:

我有一个名为“参与者”的表,其中包含 3 个字段:
prt_id
prt_event_id
prt_participant_id

我有一个选择查询,其中 event_id 上有 where 条件。查询返回假设 20 行(20 个不同的参与者)。我想做的是能够找出给定参与者的行号(prt_id)。

SELECT * 
FROM participants
WHERE prt_id = someinteger

【问题讨论】:

  • RowID 是 Oracle 独有的功能:docs.oracle.com/cd/B19306_01/server.102/b14200/…
  • 你需要这个做什么?行的顺序不是你添加记录的顺序,你知道的。
  • 当然……但我想让帖子保持简单。事实上,我根据时间戳订购了我的选择查询......

标签: php mysql sql


【解决方案1】:

虽然您无法使用 MySQL 专门查找行 ID,但您可以执行以下操作:

$conn = new mysqli(/*dbinfo*/);
$res = $conn->query("SELECT prt_id FROM participants");

$rowids = array(); $currid = 1;
while ($row = $res->fetch_object()) { // this is using the mysqli library
  $rowids[$row->prt_id] = $currid;
  $currid++;
}

这将为您提供与 prt_id 关联的 id 数组。

【讨论】:

  • 你好,贝兹。我一直在寻找除了 while 循环之外的另一种解决方案,但正如我所见,没有诸如 rowId 之类的东西或类似的东西。谢谢...
  • 正如我所指出的,如果你插入一行会发生什么,下次你得到这个时,你的号码将与之前的不匹配。
  • @Churk 只要您不指定 ORDER BY prt_id 子句或删除值,那么 id 应该始终保持不变。
  • 如果你不删除。这不是你可以保证的。特别是对于应用程序的生命周期。
【解决方案2】:

你可以这样做:

<?php

$counter = 1; // Start at one for first entry

$res = mysql_query("SELECT * FROM participants WHERE prt_id = 12");

while( $array = mysql_fetch_assoc($res) )
{
    // Do something with the counter, store it into array with details
    $counter++;
}
?>

【讨论】:

    【解决方案3】:

    这应该在 MySQL 中执行您想要的操作(即按 prt_id 的顺序分配 rownum),但性能将取决于表中的行数,因此不是最佳的。

    SELECT * FROM (
      SELECT @tmp:=@tmp+1 rownum, p.*
      FROM (SELECT @tmp:=0) z, participants p
      ORDER BY prt_id
    ) participants
    WHERE prt_id = 36;
    

    演示here.

    编辑:这种“doh 级别”重写使用简单的索引范围而不是表扫描,因此应该更快(前提是 prt_id 是 PRIMARY KEY)

    SELECT *, COUNT(p2.prt_id) ROWNUM
    FROM participants p1
    JOIN participants p2
      ON p1.prt_id >= p2.prt_id
    WHERE p1.prt_id=36;
    

    演示here.

    【讨论】:

    • 很好的答案,但就像你说的那样,即使是最少量的行,这也会很慢。 +1
    【解决方案4】:

    您可以在数据库中添加一个索引列,将其设置为 int、主键和自动增量。然后在检索行时检索索引号。

    【讨论】:

    • 这与使用其中一个主键列的想法相同,只是因为您分配了自动增量,如果您删除一行并插入另一行,您将不会重用已删除行的 id。跨度>
    【解决方案5】:

    RowID 是 Oracle 的一项功能:http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm

    MySQL 没有类似的东西,您基本上可以通过在检索每一行时将数字分配给 php 内的数组来模拟它,但这并不能保证您下次检索该结果时使用相同的数字。您可能不得不接受使用其中一个主要 ID

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      相关资源
      最近更新 更多