相当于@row:= @ row + 1的php是什么 - php

我有一个MySQL语句,可以在SQL数据库游乐场中成功运行。它查询并返回我的location_values表中的第10行,而不管ID的间隔如何。

看起来像这样:

的MySQL

set @row:=-1;

SELECT location_values.*
FROM
    location_values
    INNER JOIN
    (
        SELECT id
        FROM
            (
                SELECT @row:=@row+1 AS rownum, id 
                FROM
                    (
                        SELECT id FROM location_values ORDER BY id
                    ) AS sorted
            ) as ranked
        WHERE rownum % 10 = 0
    ) AS subset
        ON subset.id = location_values.id

working db-fiddle

问题:我想在上面转换此语句并改为在PHP查询中运行它,但是这样做有问题。

目前,我的自定义PHP函数将继续打印整个表,而不是按照MySQL语句的第10行。我怀疑是由于未解释set @row:=-1;中的@row:=@row+1PHP

我的PHP功能

function get_incidents() {

$row = -1;

$query = query("

SELECT location_values.*
FROM
    location_values
    INNER JOIN
    (
        SELECT id
        FROM
            (
                SELECT $row + 1 AS rownum, id 
                FROM
                    (
                        SELECT id FROM location_values ORDER BY id
                    ) AS sorted
            ) as ranked
        WHERE rownum % 10 = 0
    ) AS subset
        ON subset.id = location_values.id");


confirm($query); //passes in the global $connection;



while ($row = fetch_array($query)) {


$incidents = <<<DELIMETER



<tr>

    <td>{$row['id']}</td>
    <td>{$row['name']}</td>
    <td>{$row['lat']}</td>
    <td>{$row['lng']}</td>


</tr>



DELIMETER;

echo $incidents;


} // end of while loop    





} // end of function 

我是PHP的新手,对于能最好地重构PHP函数以实现我的目标(无论ID的间隔如何)返回第10行的目标,我将不胜感激。

参考方案

MySQL> 8.0
您可以使用窗口功能来完成相同的任务。如果我没有记错的话,正确的方法如下:

SELECT t.* FROM (SELECT *, Row_number() OVER() AS rn FROM location_values) t 
WHERE t.rn % 10 = 1

https://www.db-fiddle.com/f/tb2nLZ6dkDPaQxkc6My9Yg/2
MySQL <8.0
您可以使用session属性来模拟window函数,但这并不总是可靠的。
方法1(只能执行一次;不推荐):

SELECT t.*
FROM
    (SELECT *, @position:=((SELECT ifnull(@position, 0)) + 1) AS rn FROM location_values) t
WHERE t.rn % 10 = 1

方法2:

SELECT location_values.*
FROM location_values,
    (SELECT @row_number:=0) AS temp
WHERE (@row_number:=@row_number + 1) % 10 = 1

https://www.db-fiddle.com/f/tb2nLZ6dkDPaQxkc6My9Yg/3

PHP mysqli获取查询返回的第一行的值 - php

我正在使用mysqli从数据库中获取某些数据。我正在使用的查询已设置为仅从数据库返回一行。有没有一种方法可以在不使用while循环的情况下获取该行的值?我知道一个while循环对于返回多于一行的行很有用,但是如果不需要while循环,我想避免这种情况,因为不必要的代码是不好的编程。 参考方案 是的-您可以使用:$row = $result->fetch…

是否可以在PHP中检索有关MySQL资源的详细信息? - php

我正在处理使用MySQL资源(public $_conn)的(PHP5)类。当我执行print_r($this->-conn)时,会看到诸如资源ID#30的文本。是否可以获取该特定资源的连接详细信息?我必须至少获得MySQL用户名? 参考方案 您应该在文件中的某个位置使用用户名,以便您可以创建连接资源。但是您可以使用以下SQL命令获取当前用户:SELE…

正则表达式,用于验证以+254开头的电话号码 - php

我正在尝试创建一个正则表达式以匹配以+254开头的电话号码电话号码示例 +254716370730+254856798768 +254765432135 我努力了preg_match('/^\\+254\\d{9}/,$phonenumber'); 但似乎无效,我们将不胜感激任何帮助 参考方案 正确的语法应为:preg_match(�…

如何在return语句中编写循环? - php

我需要得到这个结果return [ [$row_0['Наименование'], $row_0['Ассортимент'], $row_0['Сумма']], [$row_1['Наименование'], $row_1['Ассортимент']…

从Codeigniter中的联接显示数据 - php

我正在使用一个简单的联接从两个数据库中提取数据。这是模型中的联接:function com_control(){ $this->db->select('*'); $this->db->from('comments'); $this->db->join('posts'…