php mysql 下一个,php – 基于名称的下一个和上一个MySQL行

我有一张关于人员详情的表格.我想根据个人的姓氏创建一个Next / Previous链接.由于人员未按字母顺序添加,因此根据其ID选择下一行或上一行不起作用.

这是一个很大的表 – 相关的字段是id,name_l和name_f.我想通过name_l订购个人的姓氏.

我将如何完成这项任务?

谢谢!

编辑

这将在Personnel Details页面上使用,结果将生成基于当前行的数据库中下一个/ prev条目的链接(按姓氏排序).例如,如果我正在查看Joe Hammer,则Next链接将链接到Frank Ingram.

最终代码

感谢Daniel,这是我最终的工作:

首先,我将增量设置为0:$i = 0.然后,在使用while循环循环记录时,我将此值增加1 = $i.然后我链接到该特定条目的详细信息页面:

Details

在Details页面上,我使用以下SQL来选择下一条记录:

$row = $_GET['row'];

$getNext = mysql_query("SELECT * FROM members ORDER BY name_l, id LIMIT ".$row.", 1");

$next = mysql_fetch_assoc($getNext);

$nextLink = $row + 1;

最后,链接:

<?php echo $next['name_l'] . ", " . $next['name_f'];?>

解决方法:

首先,确保将name_l列编入索引.然后你可以简单地使用ORDER BY和LIMIT子句,如下所示:

SELECT * FROM personnel ORDER BY name_l, id LIMIT 0, 1;

只需增加LIMIT子句中的0值,即可选择有序集中的下一条记录.因此,使用LIMIT 1,1获取第二条记录,LIMIT 2,1为第三条记录,等等.

要在name_l上创建索引,可以使用CREATE INDEX命令:

CREATE INDEX ix_index_name ON personnel (name_l);

测试用例:

CREATE TABLE personnel (

id int not null primary key,

name_l varchar(10),

name_f varchar(10)

);

CREATE INDEX ix_last_name_index ON personnel (name_l);

INSERT INTO personnel VALUES (1, 'Pacino', 'Al');

INSERT INTO personnel VALUES (2, 'Nicholson', 'Jack');

INSERT INTO personnel VALUES (3, 'De Niro', 'Robert');

INSERT INTO personnel VALUES (4, 'Newman', 'Paul');

INSERT INTO personnel VALUES (5, 'Duvall', 'Robert');

结果:

SELECT * FROM personnel ORDER BY name_l, id LIMIT 0, 1;

+----+---------+--------+

| id | name_l | name_f |

+----+---------+--------+

| 3 | De Niro | Robert |

+----+---------+--------+

1 row in set (0.00 sec)

SELECT * FROM personnel ORDER BY name_l, id LIMIT 1, 1;

+----+--------+--------+

| id | name_l | name_f |

+----+--------+--------+

| 5 | Duvall | Robert |

+----+--------+--------+

1 row in set (0.00 sec)

SELECT * FROM personnel ORDER BY name_l, id LIMIT 2, 1;

+----+--------+--------+

| id | name_l | name_f |

+----+--------+--------+

| 4 | Newman | Paul |

+----+--------+--------+

1 row in set (0.00 sec)

第一更新:(继续下面的评论)

以上示例主要适用于您首先显示第一条记录,然后依次移动到下一条记录,也可能再次向下一条记录,也许还有一条记录,等等.您也可以轻松向前移动x步,向后移动x步,但这样似乎不是必需的.

但是,如果从随机记录开始,则更难以调整上述查询以获取下一个和上一个记录.

如果是这种情况,那么您可以简单地保留一个您当前所在位置的索引计数器.你从$index = 0开始,并使用… LIMIT $index,1显示第一条记录.然后通过将$index递增1来显示下一条记录,并通过将$index递减1来显示前一条记录.

另一方面,如果你将渲染人员列表,然后用户将点击一个记录(随机),你也可以在应用程序端(php)的帮助下完成这项工作.假设您向用户呈现以下有序列表:

+----+-----------+--------+

| id | name_l | name_f |

+----+-----------+--------+ // [Hidden info]

| 3 | De Niro | Robert | // Row 0

| 5 | Duvall | Robert | // Row 1

| 4 | Newman | Paul | // Row 2

| 2 | Nicholson | Jack | // Row 3

| 1 | Pacino | Al | // Row 4

+----+-----------+--------+

现在,如果用户点击Newman Paul,则必须将row = 2参数传递给将显示该员工详细信息的页面.现在,呈现员工详细信息的页面知道Newman Paul是第3行(row = 2).因此,要获取上一个和下一个记录,您只需更改LIMIT x中的x,按行添加1 – 前一个记录为1,下一个记录为行1:

-- Previous

SELECT * FROM personnel ORDER BY name_l, id LIMIT 1, 1;

+----+--------+--------+

| id | name_l | name_f |

+----+--------+--------+

| 5 | Duvall | Robert |

+----+--------+--------+

1 row in set (0.00 sec)

-- Next

SELECT * FROM personnel ORDER BY name_l, id LIMIT 3, 1;

+----+-----------+--------+

| id | name_l | name_f |

+----+-----------+--------+

| 2 | Nicholson | Jack |

+----+-----------+--------+

1 row in set (0.00 sec)

第二次更新:

您可以使用以下特定于MySQL的查询来获取任何随机员工的有序列表中的记录编号,然后可以使用该编号来获取上一个和下一个记录.但请注意,这不是非常有效,如果您有数千条记录,可能会降低性能.

假设你是雇员Nicholson Jack.

您可以执行以下查询:

SELECT p.id, p.name_l, p.name_f, o.record_number

FROM personnel p

JOIN (

SELECT id,

@row := @row + 1 AS record_number

FROM personnel

JOIN (SELECT @row := -1) r

ORDER BY name_l, id

) o ON (o.id = p.id)

WHERE p.name_l = 'Nicholson' AND p.name_f = 'Jack';

哪个返回:

+----+-----------+--------+---------------+

| id | name_l | name_f | record_number |

+----+-----------+--------+---------------+

| 2 | Nicholson | Jack | 3 |

+----+-----------+--------+---------------+

1 row in set (0.00 sec)

请注意,在WHERE子句中,如果id已知,则可以使用p.id = 2,而不是p.name_l =’Nicholson’和p.name_f =’Jack’.

现在我们可以使用record_number字段(在这种情况下为3)来获取上一个和下一个记录,只需使用此答案顶部的原始查询,并将LIMIT 2,1替换为前一个和LIMIT 4, 1为下一个.你去:

Nicholson Jack的前一个:

SELECT * FROM personnel ORDER BY name_l, id LIMIT 2, 1;

+----+--------+--------+

| id | name_l | name_f |

+----+--------+--------+

| 4 | Newman | Paul |

+----+--------+--------+

1 row in set (0.00 sec)

尼克尔森杰克的下一个:

SELECT * FROM personnel ORDER BY name_l, id LIMIT 4, 1;

+----+--------+--------+

| id | name_l | name_f |

+----+--------+--------+

| 1 | Pacino | Al |

+----+--------+--------+

1 row in set (0.00 sec)

标签:next,php,mysql,row

来源: https://codeday.me/bug/20190724/1518477.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值