Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何获取sql表ID的行号?_Php_Sql - Fatal编程技术网

Php 如何获取sql表ID的行号?

Php 如何获取sql表ID的行号?,php,sql,Php,Sql,假设我需要打印第3行、第5行、第9行、第20行、第34行等等……行,按位置,在数据库中没有实际意义(至少我想不出任何)。为什么您关心它的实际行位置 您如何知道第三条记录是您要删除的记录?匹配一个ID,匹配另一个字段中的一个短语,做一些事情将该记录唯一地标识为您想要访问的记录。按it行位置执行此操作不会为您执行此操作 如果有五条记录完全匹配,并且只想删除一条,则在delete语句末尾添加LIMIT 1。如果它们是精确的,那么争吵就无关紧要了。第三个、第五个或第七个并不重要,因为它们与您的查询完全匹

假设我需要打印第3行、第5行、第9行、第20行、第34行等等……

行,按位置,在数据库中没有实际意义(至少我想不出任何)。为什么您关心它的实际行位置

您如何知道第三条记录是您要删除的记录?匹配一个ID,匹配另一个字段中的一个短语,做一些事情将该记录唯一地标识为您想要访问的记录。按it行位置执行此操作不会为您执行此操作

如果有五条记录完全匹配,并且只想删除一条,则在delete语句末尾添加LIMIT 1。如果它们是精确的,那么争吵就无关紧要了。第三个、第五个或第七个并不重要,因为它们与您的查询完全匹配。因此,删除一个匹配的查询

现在,听起来好像您正在以某种顺序向用户显示一个数据表,这些数据可能重复,也可能不重复,并允许用户选择删除一行。您使用的是实际的行位置,而不是将主键存储在每个显示的行中。然后,当用户选择删除时,您只需使用附加到该行的主键并删除该行

你说“主键和其他几个字段是相同的”-这不可能是真的,因为你不能有相同的主键。我现在认为您的数据库设计中存在一些缺陷。发布一个表模式和您正在做的事情的示例。如果你在设计上把自己逼到了一个角落,那么继续下去就没有意义了(听起来像)


(我不能对其他帖子发表评论,所以更新必须在这篇帖子中编辑)

在数据库中,按位置划分的行没有实际意义(至少我想不出任何行)。为什么您关心它的实际行位置

您如何知道第三条记录是您要删除的记录?匹配一个ID,匹配另一个字段中的一个短语,做一些事情将该记录唯一地标识为您想要访问的记录。按it行位置执行此操作不会为您执行此操作

如果有五条记录完全匹配,并且只想删除一条,则在delete语句末尾添加LIMIT 1。如果它们是精确的,那么争吵就无关紧要了。第三个、第五个或第七个并不重要,因为它们与您的查询完全匹配。因此,删除一个匹配的查询

现在,听起来好像您正在以某种顺序向用户显示一个数据表,这些数据可能重复,也可能不重复,并允许用户选择删除一行。您使用的是实际的行位置,而不是将主键存储在每个显示的行中。然后,当用户选择删除时,您只需使用附加到该行的主键并删除该行

你说“主键和其他几个字段是相同的”-这不可能是真的,因为你不能有相同的主键。我现在认为您的数据库设计中存在一些缺陷。发布一个表模式和您正在做的事情的示例。如果你在设计上把自己逼到了一个角落,那么继续下去就没有意义了(听起来像)


(我无法对其他帖子发表评论,因此必须在此帖子中编辑更新)

LIMIT子句的偏移部分使用SELECT查询


您想做什么???

LIMIT子句的偏移部分与SELECT查询一起工作


您想做什么???

SQL表中的行没有任何特定的顺序。您可以按特定字段对它们进行排序,就像我假设的ID是一个自动递增值一样。如果在按ID排序时需要第二行,可以执行以下查询

SELECT * FROM MyTable ORDER BY ID LIMIT 1,1
要获得第19排,您需要

SELECT * FROM MyTable ORDER BY ID LIMIT 18,1
使用limit语句返回一组特定的行。如果需要第10行到第19行,可以使用

SELECT * FROM MyTable ORDER BY ID LIMIT 9,10

在limit语句中,第一个数字表示行号(基于0),第二个数字表示要返回的行数。

SQL表中的行没有任何特定顺序。您可以按特定字段对它们进行排序,就像我假设的ID是一个自动递增值一样。如果在按ID排序时需要第二行,可以执行以下查询

SELECT * FROM MyTable ORDER BY ID LIMIT 1,1
要获得第19排,您需要

SELECT * FROM MyTable ORDER BY ID LIMIT 18,1
使用limit语句返回一组特定的行。如果需要第10行到第19行,可以使用

SELECT * FROM MyTable ORDER BY ID LIMIT 9,10

在limit语句中,第一个数字表示行号(基于0),第二个数字表示要返回的行数。

也可以使用行号变量:

SELECT * FROM (
    SELECT t.*, 
        @rownum = @rownum + 1 AS rank
    FROM TABLE t, (SELECT @rownum := 0) r
    ORDER BY ID
    LIMIT 0, 34
) Q
WHERE rank in (3, 5, 9, 20, 34)
我会尽量巧妙地使用
限制
,否则每次它都会扫描整个表


根据您对场景的描述


我的场景:我只需要删除一行。。。有几行完全相同。。因此,使用带有where子句的delete将删除所有这些内容。另外,假设有5行相同的行。。我需要删除这5行中的第三行

您确实需要小心,否则会删除错误的行。考虑一个好的标准,可以区分要删除的行和其他行,比如。。是否要删除最新的,或除最新的以外的所有

您可以使用@rownum技巧的扩展版本从每个组中删除第n个。。但在我开始之前,最好先了解一下你的具体问题


啊,现在猴子从袖子里出来了:

假设有5个相同的行。。用户点击第三行并要求删除。。。where查询将不会有效,因为它会删除与where子句匹配的第一行或与之匹配的所有行。。我怎么能只删除第三行,而保留所有其他行不变


忘掉我说的一切。您的表中需要一个
自动增量
字段,唯一地标识您的记录。然后可以使用
DELETE FROM-table,其中id=$id
。感谢OMG小马的OP治疗;)

还可以使用行号变量:

SELECT * FROM (
    SELECT t.*, 
        @rownum = @rownum + 1 AS rank
    FROM TABLE t, (SELECT @rownum := 0) r
    ORDER BY ID
    LIMIT 0, 34
) Q
WHERE rank in (3, 5, 9, 20, 34)
我会尽量巧妙地使用
限制
,否则每次它都会扫描整个表