【问题标题】:how to select the rows with id's just one above gaps如何选择 id 仅高于空白的行
【发布时间】:2015-06-23 22:02:33
【问题描述】:

我有一个包含 idname 列的表。我的重点是id 的顺序。事实上,我想选择行,当数字的顺序时 id 中断。看我的例子:

// mytable
+----+-----------+
| id |    name   |
+----+-----------+
| 1  |   ali     |
| 2  |   jack    |
| 3  |   peter   |
| 5  |   steve   |
| 6  |   lenord  |
| 7  |   jack    |
| 9  |   fered   |
+----+-----------+

现在我想select where id=5select where id=9。因为id=4id=8 被删除了。

编辑:我想要这个输出:

// mytable
+----+-----------+
| id |    name   |
+----+-----------+
| 5  |   steve   |
| 9  |   fered   |
+----+-----------+

我可以这样做吗?

【问题讨论】:

  • 你的意思是id=4 被删除了吗? id=5 在您的样本中存在并且很好。是的,您可以使用一些丑陋的查询来“查看”表中的其他行。
  • @MarcB 完全正确。那我就可以做到了。反正tnx
  • 如果您在查询中调用一个不存在的 ID,您将不会得到结果。因此,如果您查询存在的 id,您将得到结果。行不像数组。除非您告诉他们这样做,否则他们不会重新编制索引。删除行时,ID Column 的值不会改变。
  • @Twisty 那这不可能吗?
  • 我想我误解了你的目标。您希望在删除其他行后收集位置 4 (ID 5) 和位置 7 (ID 9) 的行。这是可以做到的。

标签: php mysql gaps-in-data


【解决方案1】:

事实上,您希望 id 的记录仅比 missing id 高一个;所以你需要用id 搜索记录,这样id-1 确实不存在(对于最低的id 总是这样,所以我们必须明确排除id=1 )

SELECT *
FROM the_table tt
WHERE id > 1
AND NOT EXISTS (
   SELECT *
   FROM the_table nx
   WHERE nx.id = tt.id -1
   );

【讨论】:

  • 我的上帝!如何 ??我以为我知道sql 但是……!!!谢谢 !只是我看不懂,可以解释一下你的代码吗?!
  • 有一个新问题,为什么我不能使用NOT IN 而不是NOT EXISTS
  • 你可能可以,但你为什么要这样做?
  • 我查了也没用,没有强制的。我只是想知道为什么NOT IN 不起作用?!
【解决方案2】:

尝试查找特定 ID。 http://php.net/manual/en/mysqli-result.data-seek.php

<?php
/* Open a connection */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SELECT id, name FROM table";
if ($result = $mysqli->query($query)) {

    /* seek to row no. 4 */
    $result->data_seek(3);

    /* fetch row */
    $row = $result->fetch_row();

    printf ("ID: %s  Name: %s\n", $row[0], $row[1]);

    /* seek to row no. 7 */
    $result->data_seek(6);

    /* fetch row */
    $row = $result->fetch_row();

    printf ("ID: %s  Name: %s\n", $row[0], $row[1]);

    /* free result set*/
    $result->close();
}

/* close connection */
$mysqli->close();
?>

这应该返回:

ID: 5 Name: steve
ID: 9 Name: fered

【讨论】:

  • 您是手动搜索的吗?实际上,我的表有 +10000 行。我需要一个自动算法。顺便说一句,data_seek(); 只是为了mysqli?我正在使用 PDO
  • 您没有说明您使用的是什么功能。你没有用足够的细节解释这个问题。 stackoverflow.com/questions/685871/…
【解决方案3】:
SELECT x.*
  FROM my_table x 
  LEFT 
  JOIN my_table y 
    ON y.id = x.id - 1 
 WHERE y.id IS NULL 
   AND x.id > 1;
+----+-------+
| id | name  |
+----+-------+
|  5 | steve | 
|  9 | fered | 
+----+-------+

【讨论】:

  • 我检查了您的代码,没有看到 idname 两列包含 NULL。那是什么?你选择x.*,那我觉得不会多两列了。
猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 2018-12-12
  • 1970-01-01
相关资源
最近更新 更多