@row:=@row+1 的 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

我有一个在数据库操场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

工作 db-fiddle


问题:我想转换上面的这个语句并在PHP查询中运行它,但是我在这样做时遇到了问题。


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


我的 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 函数以实现我的目标,即返回每 10 行而不考虑 ID 中的空白,我将不胜感激。


一只萌萌小番薯
浏览 242回答 2
2回答

尚方宝剑之说

我有一个在数据库操场MySQL上成功运行的语句。SQL它查询并返回我的 location_values 表中的每 10 行,而不管 ID 中的任何间隙。它看起来像这样:MySQLset @row:=-1;SELECT location_values.*FROM&nbsp; &nbsp; location_values&nbsp; &nbsp; INNER JOIN&nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; SELECT id&nbsp; &nbsp; &nbsp; &nbsp; FROM&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT @row:=@row+1 AS rownum, id&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT id FROM location_values ORDER BY id&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) AS sorted&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) as ranked&nbsp; &nbsp; &nbsp; &nbsp; WHERE rownum % 10 = 0&nbsp; &nbsp; ) AS subset&nbsp; &nbsp; &nbsp; &nbsp; ON subset.id = location_values.id工作 db-fiddle问题:我想转换上面的这个语句并在PHP查询中运行它,但是我在这样做时遇到了问题。按照目前的情况,我的自定义PHP函数继续打印整个表,而不是按照 MySQL 语句每 10 行打印一次。我怀疑是由于不解释set @row:=-1;而@row:=@row+1在PHP.我的 PHP 函数function get_incidents() {$row = -1;$query = query("SELECT location_values.*FROM&nbsp; &nbsp; location_values&nbsp; &nbsp; INNER JOIN&nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; SELECT id&nbsp; &nbsp; &nbsp; &nbsp; FROM&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT $row + 1 AS rownum, id&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT id FROM location_values ORDER BY id&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) AS sorted&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) as ranked&nbsp; &nbsp; &nbsp; &nbsp; WHERE rownum % 10 = 0&nbsp; &nbsp; ) AS subset&nbsp; &nbsp; &nbsp; &nbsp; ON subset.id = location_values.id");confirm($query); //passes in the global $connection;while ($row = fetch_array($query)) {$incidents = <<<DELIMETER<tr>&nbsp; &nbsp; <td>{$row['id']}</td>&nbsp; &nbsp; <td>{$row['name']}</td>&nbsp; &nbsp; <td>{$row['lat']}</td>&nbsp; &nbsp; <td>{$row['lng']}</td></tr>DELIMETER;echo $incidents;} // end of while loop&nbsp; &nbsp;&nbsp;} // end of function&nbsp;我对 PHP 很陌生,对于如何最好地重构我的 PHP 函数以实现我的目标,即返回每 10 行而不考虑 ID 中的空白,我将不胜感激。

开满天机

MySQL >8.0您可以使用窗口函数来完成相同的任务。如果我没记错的话,正确的做法如下:SELECT t.* FROM (SELECT *, Row_number() OVER() AS rn FROM location_values) t&nbsp;WHERE t.rn % 10 = 1https://www.db-fiddle.com/f/tb2nLZ6dkDPaQxkc6My9Yg/2MySQL <8.0您可以使用会话属性模拟窗口函数,但这并不总是可靠的。方法一(只能执行一次,不推荐):SELECT t.*FROM&nbsp; &nbsp; (SELECT *, @position:=((SELECT ifnull(@position, 0)) + 1) AS rn FROM location_values) tWHERE t.rn % 10 = 1方法二:SELECT location_values.*FROM location_values,&nbsp; &nbsp; (SELECT @row_number:=0) AS tempWHERE (@row_number:=@row_number + 1) % 10 = 1https://www.db-fiddle.com/f/tb2nLZ6dkDPaQxkc6My9Yg/3
打开App,查看更多内容
随时随地看视频慕课网APP